Содержание статьи
Всегда используйте wp_enqueue_*
-функции. Прямая вставка через header.php
или footer.php
нарушает системную архитектуру и ломает кэш браузера. Это не просто рекомендация – это минимальное требование к разработчику, который понимает, как работает ядро.
Регистрировать нужно в хуках. Точка входа – функция wp_enqueue_scripts
. Не init
, не template_redirect
, не wp_head
. Пример:
function my_theme_assets() {
wp_enqueue_style(\'main-style\', get_stylesheet_uri());
wp_enqueue_script(\'custom-js\', get_template_directory_uri() . \'/assets/js/custom.js\', array(\'jquery\'), null, true);
}
add_action(\'wp_enqueue_scripts\', \'my_theme_assets\');
Внимание! Порядок имеет значение. Если вы подключаете jQuery-плагин, убедитесь, что jquery
указан как зависимость. Без этого порядок загрузки будет случайным, и скрипты упадут.
Не используйте абсолютные пути руками. Только get_template_directory_uri()
или get_stylesheet_directory_uri()
. Первый – для родительской темы, второй – для дочерней. Смешивание приводит к конфликтам и трудноуловимым багам при обновлениях.
Отключить скрипт ядра? Легко. Но подумайте, зачем. Пример:
function dequeue_default_jquery() {
if (!is_admin()) wp_dequeue_script(\'jquery\');
}
add_action(\'wp_enqueue_scripts\', \'dequeue_default_jquery\', 100);
Важно помнить: wp_register_*
нужен, когда ресурсы используются выборочно. Например, только на конкретной странице или в определённом шаблоне. Без регистрации вручную невозможно контролировать логику условных подключений.
Важно! Не используйте
wp_enqueue_script
внутри шаблонов. Это разрушает иерархию загрузки и создает лишние вызовы при каждом рендере.
Пример условной загрузки:
function my_conditional_assets() {
if (is_page(\'contact\')) {
wp_enqueue_script(\'mapbox\', \'https://api.mapbox.com/mapbox.js\', array(), null, true);
}
}
add_action(\'wp_enqueue_scripts\', \'my_conditional_assets\');
Никаких echo
в functions.php
. Никаких <script>
в хедере. Если нужно вставить инлайн-код – используйте wp_add_inline_script()
. Пример:
wp_add_inline_script(\'custom-js\', \'const siteUrl = \"\' . home_url() . \'\";\');
Хотите подключить ресурсы в админке? Используйте admin_enqueue_scripts
. Всё то же самое, но для интерфейса редакторов. Без этого – бардак в консоли, конфликты с плагинами и сломанный Gutenberg.
Помните: любые внешние ресурсы должны быть загружены один раз. Повторная регистрация с другим хендлом – путь к хаосу.
Ошиблись с handle? WP не даст второй раз загрузить один и тот же URL. Но только если handle совпадает. Сменили название – получите дубликат. Профиль загрузки покажет два одинаковых скрипта. Разница будет незаметна, пока не сломается кеш или не уедет порядок загрузки.
Не оставляйте вызовы wp_enqueue_script
и wp_enqueue_style
без версии. Поставьте null
или вручную задайте хэш. Без этого кеш браузера не сбрасывается при обновлении файла, и пользователи видят старые стили или JS. Пример:
wp_enqueue_style(\'theme-css\', get_template_directory_uri() . \'/style.css\', array(), filemtime(get_template_directory() . \'/style.css\'));
Итог: используйте системные методы. Изучите хендлы ядра. Не изобретайте велосипед. Следите за порядком и зависимостями. И всегда тестируйте в режиме SCRIPT_DEBUG
.
Регистрация и подключение файлов с помощью wp_enqueue_script и wp_enqueue_style
Всегда регистрируйте активы перед тем, как использовать их в шаблоне. Прямая вставка через <link>
или <script>
– грубейшая ошибка. Так ломаются зависимости, дублируются версии и рушится кеширование.
Сначала wp_register_script()
и wp_register_style()
, затем wp_enqueue_script()
и wp_enqueue_style()
. Регистрация – это объявление, загрузка – это вызов.
Пример грамотного использования:
function my_assets() {
wp_register_script( \'custom-js\', get_template_directory_uri() . \'/assets/js/custom.js\', array(\'jquery\'), \'1.0.3\', true );
wp_register_style( \'custom-css\', get_template_directory_uri() . \'/assets/css/custom.css\', array(), \'1.0.3\' );
wp_enqueue_script( \'custom-js\' );
wp_enqueue_style( \'custom-css\' );
}
add_action( \'wp_enqueue_scripts\', \'my_assets\' );
Не указывайте версии \»на глаз\». При обновлении файлов забывают менять номер – кеш продолжает грузить старое. Используйте filemtime()
:
$ver = filemtime( get_template_directory() . \'/assets/js/custom.js\' );
wp_register_script( \'custom-js\', get_template_directory_uri() . \'/assets/js/custom.js\', array(), $ver, true );
Важно: избегайте подключения внешних библиотек напрямую с CDN без проверки доступности – сеть может упасть, и весь фронт развалится.
Третьи зависимости подключайте с условиями. Пример:
if ( is_singular( \'product\' ) ) {
wp_enqueue_script( \'product-slider\', get_template_directory_uri() . \'/js/slider.js\', array(\'jquery\'), null, true );
}
Никогда не вставляйте одинаковые файлы в нескольких местах – один раз на хуке, без исключений. Дубли легко возникает при включении модулей через плагин и тему одновременно.
Внимание! Все функции регистрации должны вызываться строго после инициализации хуков. Оптимальное место –
wp_enqueue_scripts
для фронта,admin_enqueue_scripts
для панели.
Уточняйте приоритет при использовании сторонних тем. Если ваш файл грузится до библиотеки, от которой он зависит – он бесполезен. Меняйте порядок, указывая зависимости массивом.
wp_enqueue_script( \'custom-js\', get_template_directory_uri() . \'/js/custom.js\', array(\'jquery-ui-core\'), null, true );
Итог: никакой самодеятельности. Только строгая регистрация, только через API. Без логики в шаблонах, без шорткатов. Иначе сломаете производительность, ломается верстка, рушатся события.
Правильное указание зависимостей и версий при подключении ресурсов
Всегда явно указывайте зависимости, иначе один конфликт – и всё летит к чёрту. Не надейтесь, что браузер сам разберётся с порядком загрузки. Это не его задача.
Например, если скрипт зависит от jQuery, не пишите просто \'jquery\'
в массиве зависимостей – убедитесь, что он зарегистрирован до этого:
wp_register_script( \'custom-lib\', get_template_directory_uri() . \'/js/lib.js\', array( \'jquery\' ), \'1.2.4\', true );
В этой строке пять аргументов. Пропустите хоть один – и будьте готовы к неожиданностям. Особенно пятый: true
означает, что код загружается в футере. Укажете false
– поймайте ошибку, если jQuery
ещё не подгружен.
Не пишите зависимости через запятую в одной строке – это не массив. Делайте как надо:
array( \'jquery\', \'wp-element\', \'wp-api-fetch\' )
Следите за версией. Никогда не оставляйте четвёртый аргумент пустым. Если не контролируете кэш, не жалуйтесь на баги из-за старого файла.
wp_enqueue_style( \'main-css\', get_stylesheet_uri(), array(), \'20250512\' );
Дата в формате YYYYMMDD
– простое решение для bust-кеширования. Или используйте filemtime()
:
wp_enqueue_style( \'main-css\', get_stylesheet_uri(), array(), filemtime( get_stylesheet_directory() . \'/style.css\' ) );
Важно: версии не должны быть фиктивными. WordPress может использовать их для построения зависимостей и корректной очереди.
Вы не указываете зависимости – значит, вы полагаетесь на случайность. Она работает до первого обновления.
Один из частых багов – два одинаковых плагина пытаются загрузить одну и ту же библиотеку. Кто первый, тот и прав. Второй – сломает всё.
Внимание! Никогда не регистрируйте один и тот же идентификатор дважды. Используйте
wp_script_is()
иwp_style_is()
для проверки.
Для скриптов лучше регистрировать сначала, а потом запускать. Это гибче:
if ( ! wp_script_is( \'custom-lib\', \'registered\' ) ) {
wp_register_script( \'custom-lib\', get_template_directory_uri() . \'/js/lib.js\', array( \'jquery\' ), \'1.2.4\', true );
}
wp_enqueue_script( \'custom-lib\' );
Никогда не грузите библиотеки напрямую через <script>
. Сломаете админку, нарушите совместимость, уничтожите REST.
Используйте механизм очереди как замок. Один вход – один ключ. Нарушите зависимость – захлопнется. Обратите внимание, WordPress не ругается, если вы ошиблись. Он просто делает вид, что всё в порядке. Но потом вы ищете баг три дня.
Пишите осознанно. Контролируйте каждую строку. И не надейтесь на магию – её нет.
Ограничение загрузки скриптов и стилей только на нужных страницах
Ограничивайте инициализацию ресурсов с использованием условных тегов в функции wp_enqueue_scripts
или в хуке admin_enqueue_scripts
, если речь идёт о панели управления. Это снижает нагрузку на страницы и ускоряет рендеринг.
function my_assets() {
if ( is_page(\'contacts\') ) {
wp_enqueue_style(\'mapbox-css\', \'https://api.mapbox.com/mapbox.css\');
wp_enqueue_script(\'mapbox-js\', \'https://api.mapbox.com/mapbox.js\', array(), null, true);
}
}
add_action(\'wp_enqueue_scripts\', \'my_assets\');
Идентификаторы страниц, шаблоны, кастомные типы – используйте всё, что доступно в контексте запроса. is_singular(\'product\')
, is_front_page()
, is_page_template(\'template-about.php\')
– каждая функция позволяет сузить область применения. Не оборачивайте весь код в if
, если нужных условий больше одного. Используйте логические операторы.
if ( is_page(array(12, \'contacts\', \'about\')) || is_singular(\'portfolio\') ) {
// нужные зависимости
}
Внимание! Если ресурс подгружается глобально, даже когда он не используется, это бьёт по скорости. Каждая строка кода – это байт памяти и миллисекунда на рендер.
Хуже всего – регистрировать и активировать всё сразу, «на всякий случай». Если условие не выполнено – ресурс не регистрируется. Нет регистрации – нет риска случайной активации через зависимость.
if ( is_single() ) {
wp_register_script(\'comments-enhanced\', plugin_dir_url(__FILE__) . \'js/comments.js\', array(\'jquery\'), \'1.0\', true);
wp_enqueue_script(\'comments-enhanced\');
}
Используйте wp_register_script
и wp_register_style
, если нужно отложить момент подключения до выполнения условий. Это дисциплинирует и упрощает поддержку.
Важно помнить: на многостраничных сайтах неправильная логика условий увеличивает общее время загрузки. Отфильтровывайте всё, что не нужно, сразу.
Не цепляйтесь за шаблоны типа page.php
– проверяйте ID и слаги. Не используйте is_page()
внутри шаблона – всегда работайте из функций, прикреплённых к хукам. Чёткая точка входа, чёткая проверка – чистый результат.
Что мешает использовать is_admin()
, get_current_screen()
или get_post_type()
в административной части? Лень? Тогда будьте готовы к хаосу.
Цепочка должна быть стройной. Условие – проверка – инициализация. Всё, что выходит за рамки – мусор. Не пишите универсальные функции, если можно написать точную. Не проверяйте URL, когда можно проверить ID.
Минимум – это максимум. Лишний вызов – лишний риск. Не усложняйте. Думайте как компилятор. Вложенность – враг.