Back

Как добавить пользовательский JavaScript в темы WordPress

Как добавить пользовательский JavaScript в темы WordPress

Вы хотите добавить пользовательский JavaScript в свою тему WordPress. Возможно, это эффект прокрутки, сторонний код отслеживания или интерактивная функциональность. Вы вставляете код в файл шаблона, и ничего не работает — или, что еще хуже, вы смешиваете PHP и JavaScript вместе и ломаете всё.

Это происходит постоянно. Решение простое: используйте встроенную систему управления скриптами WordPress вместо жесткого кодирования тегов <script>.

Ключевые выводы

  • Всегда используйте wp_enqueue_script для добавления JavaScript в темы WordPress вместо жесткого кодирования тегов <script> в шаблонах.
  • Храните PHP и JavaScript в отдельных файлах, чтобы избежать конфликтов и поддерживать чистый, легко отлаживаемый код.
  • Используйте условную загрузку с функциями типа is_singular() или is_page(), чтобы загружать скрипты только там, где они нужны.
  • Используйте стратегии загрузки defer и async (доступны с WordPress 6.3) для улучшения производительности страниц.

Почему следует ставить скрипты в очередь в WordPress

WordPress работает в сложной экосистеме тем и плагинов. Когда вы вставляете JavaScript напрямую в шаблоны, вы создаете проблемы:

  • Дублированная загрузка: Несколько плагинов могут загружать одну и ту же библиотеку.
  • Сбои зависимостей: Ваш скрипт выполняется до загрузки его зависимостей.
  • Проблемы с кешированием: Браузеры не могут правильно кешировать встроенные скрипты.
  • Конфликты: Скрипты мешают друг другу без координации.

Функция wp_enqueue_script решает эти проблемы, позволяя WordPress управлять порядком загрузки скриптов, зависимостями и местом вывода.

Правильный способ добавления JavaScript в WordPress

Шаг 1: Создайте файл JavaScript

Разместите ваш JavaScript в директории темы. Типичная структура:

your-theme/
├── js/
│   └── custom.js
├── functions.php
└── style.css

Пишите чистый JavaScript без примеси PHP:

document.addEventListener('DOMContentLoaded', function() {
    // Ваш код здесь
});

Шаг 2: Поставьте скрипт в очередь в functions.php

Добавьте это в functions.php вашей темы:

function mytheme_enqueue_scripts() {
    wp_enqueue_script(
        'mytheme-custom',                              // Идентификатор
        get_template_directory_uri() . '/js/custom.js', // Источник
        array(),                                        // Зависимости
        '1.0.0',                                        // Версия
        array( 'in_footer' => true )                   // Загрузка в футере
    );
}
add_action( 'wp_enqueue_scripts', 'mytheme_enqueue_scripts' );

Для дочерних тем используйте get_stylesheet_directory_uri() вместо get_template_directory_uri().

Понимание параметров wp_enqueue_script

Функция принимает пять параметров:

ПараметрНазначениеПример
$handleУникальный идентификатор'mytheme-custom'
$srcURL файлаget_template_directory_uri() . '/js/file.js'
$depsНеобходимые скрипты, которые должны загрузиться первымиarray( 'jquery' )
$verСтрока версии для сброса кеша'1.0.0'
$argsСтратегия загрузки и расположениеarray( 'in_footer' => true, 'strategy' => 'defer' )

Условная загрузка скриптов

Не загружайте скрипты везде, когда они нужны только на определенных страницах:

function mytheme_enqueue_scripts() {
    if ( is_singular( 'post' ) ) {
        wp_enqueue_script( 'mytheme-post-scripts', /* ... */ );
    }

    if ( is_page( 'contact' ) ) {
        wp_enqueue_script( 'mytheme-contact-form', /* ... */ );
    }
}
add_action( 'wp_enqueue_scripts', 'mytheme_enqueue_scripts' );

Стратегии загрузки с учетом производительности

WordPress 6.3 представил встроенную поддержку загрузки defer и async:

wp_enqueue_script(
    'mytheme-analytics',
    get_template_directory_uri() . '/js/analytics.js',
    array(),
    '1.0.0',
    array(
        'in_footer' => true,
        'strategy'  => 'defer'
    )
);

Defer выполняет скрипты после парсинга DOM, сохраняя их объявленный порядок. Async выполняет скрипты сразу после загрузки, без гарантированного порядка. Используйте defer в большинстве случаев и async для независимых скриптов, таких как аналитика.

Современный WordPress: модули скриптов и интеграция с блоками

WordPress продолжает развивать обработку JavaScript. Два важных нововведения:

API модулей скриптов: WordPress 6.5 представил wp_enqueue_script_module() для нативных ES-модулей. Это позволяет использовать современные паттерны JavaScript с правильным импортом модулей.

Блочные темы: Если вы создаете блоки, объявляйте скрипты в block.json, используя поля viewScript или viewScriptModule, вместо ручной постановки в очередь. WordPress автоматически обрабатывает загрузку при рендеринге блока.

Эти подходы работают наряду с традиционной постановкой в очередь — выбирайте в зависимости от потребностей вашего проекта.

Заключение

Добавление пользовательского JavaScript в темы WordPress требует использования системы постановки в очередь, а не жестко закодированных тегов скриптов. Создавайте отдельные файлы JavaScript, регистрируйте их с помощью wp_enqueue_script, правильно объявляйте зависимости и используйте условную загрузку, чтобы избежать ненужных запросов. Для лучшей производительности используйте стратегии defer и async, доступные с WordPress 6.3.

Паттерн прост: держите PHP и JavaScript раздельно, позвольте WordPress управлять загрузкой, и ваши скрипты будут надежно работать во всех темах и плагинах.

Часто задаваемые вопросы

Да. Вместо передачи пути к локальному файлу в качестве источника укажите полный URL внешнего скрипта. Например, используйте https://cdn.example.com/library.min.js в качестве второго параметра. WordPress выведет тег скрипта с этим URL. Вы по-прежнему можете устанавливать зависимости, версионность и стратегию загрузки как обычно.

WordPress игнорирует повторные регистрации. После того как идентификатор поставлен в очередь, все последующие вызовы с тем же идентификатором пропускаются. Это предотвращает многократную загрузку одного и того же скрипта, что является одним из главных преимуществ системы постановки в очередь перед ручным добавлением тегов скриптов в шаблоны.

Используйте функцию wp_localize_script или более новую функцию wp_add_inline_script. wp_localize_script создает JavaScript-объект с вашими данными PHP и прикрепляет его к определенному идентификатору скрипта. Это позволяет передавать значения, такие как URL для AJAX, токены nonce или настройки темы из PHP в ваш JavaScript без смешивания двух языков.

WordPress больше не включает jQuery по умолчанию в блочных темах. Для новых проектов обычно предпочтительнее чистый JavaScript или современные фреймворки. Если ваша тема или её плагины всё ещё зависят от jQuery, вы можете поставить его в очередь, указав jquery в качестве зависимости. В противном случае написание чистого JavaScript без зависимостей делает вашу тему легче и быстрее.

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay