wp_enqueue_script() совсем не работает
Я пытаюсь подключить JavaScript файлы используя wp_enqueue_script(), но это совсем не работает. Вот мой код:
function load_css_js() {
// Подключаем основной CSS файл
wp_enqueue_style('gdgt-base', get_template_directory_uri() . '/css/gdgt-base.css');
// Подключаем файл иконок
wp_enqueue_style('gdgt-icon', get_template_directory_uri() . '/icons/css/gdgt.css', true);
// Регистрируем основной JS файл
wp_register_script('gdgt-base', get_template_directory_uri() . '/js/gdgt-base.js', array( 'jquery' ) , true);
// Подключаем зарегистрированный скрипт
wp_enqueue_script('gdgt-base');
}
add_action('wp_enqueue_scripts', 'load_css_js');
Однако, когда я отменяю регистрацию стандартного JavaScript WordPress и регистрирую jQuery из другого источника - всё работает. Что может вызывать эту проблему? Спасибо за помощь!

wp_enqueue_style
и wp_enqueue_script
принимают множество параметров, и очень важно использовать их в правильном порядке, иначе эти функции не сработают.
Вот полный набор параметров для каждой функции.
wp_enqueue_style( $handle, $src, $deps, $ver, $media );
wp_enqueue_script( $handle, $src, $deps, $ver, $in_footer );
В вашем wp_enqueue_style
вы правильно определяете $handle
и $src
, но указываете $deps
как true
, что неверно. То же самое касается и wp_enqueue_script
.
Вот исправленная функция.
function load_css_js() {
wp_enqueue_style( 'gdgt-base', get_template_directory_uri() . '/css/gdgt-base.css', false, NULL, 'all' );
wp_enqueue_style( 'gdgt-icon', get_template_directory_uri() . '/icons/css/gdgt.css', false, NULL, 'all' );
wp_register_script( 'gdgt-base', get_template_directory_uri() . '/js/gdgt-base.js', array( 'jquery' ), NULL, false );
wp_enqueue_script( 'gdgt-base' );
}
add_action( 'wp_enqueue_scripts', 'load_css_js' );
Для получения дополнительной информации ознакомьтесь с документацией по каждой функции в кодексе.

РЕДАКТИРОВАТЬ: Похоже, что JS-файл загружается, но код в этом файле не работает. (Он работает, если я отключаю стандартный jQuery). | К сожалению, исправленный код не работает :(

Я только что проверил, и всё работает нормально. Думаю, в вашей теме какая-то другая функция переопределяет вывод. Поищите другие функции wp_enqueue_scripts
...

Это совершенно другая тема, почему ваш код в JS-файлах не работает. Основная причина, по которой JS-код не работает с базовым jQuery
, но работает с внешним jQuery
, может заключаться в том, что базовый jQuery
запускается в режиме noconflict. А ваш JS-код — нет. Вам нужно изменить ваш JS-код для работы с jQuery в режиме noconflict.

Дело в том, что я загружаю последнюю версию jQuery с http://code.jquery.com/jquery-latest.min.js, и она работает. Так что же может вызывать конфликт?

Вот решение вашей другой проблемы. Почему $ для jQuery не работает?. Переведите ваш код в режим jQuery noconflict, и он заработает.

Большое спасибо, Роберт! Если кто-то еще столкнется с этим, просто используйте: (function($){
$(document).ready(function(){
//your code
});
})(jQuery);
:)

Эмм, у меня еще один вопрос. Я заменил false
на true
для параметра $in_footer
, но это не сработало. Я также заглянул в кодекс, и похоже, что в одном из их примеров указано true
. Но по какой-то причине у меня это не работает.

Обычно это должно работать, не уверен, почему у вас не получается.

Похоже, вы используете один и тот же хэндл для регистрации скрипта и таблицы стилей. Не уверен, является ли это проблемой, так как один — это CSS, а другой — JS gdgt-base'

Для таких же идиотов, как я, решил поделиться здесь. :-)
Я только что потратил час, потому что написал array( '' )
вместо array()
в зависимостях.
Просто знайте, что есть разница между:
wp_enqueue_script( 'footerScript', get_stylesheet_directory_uri() . '/assets/js/appFooter.js', array( '' ), false, true );
и
wp_enqueue_script( 'footerScript', get_stylesheet_directory_uri() . '/assets/js/appFooter.js', array(), false, true );
... Первый вариант никогда не загрузится. Второй — загрузится. :-)
Ответ @Robert_Hue помог мне найти решение.

При регистрации и подключении скриптов не обязательно вызывать wp_register_script() и wp_enqueue_script() отдельно. Достаточно вызвать только wp_enqueue_script().
Базовый синтаксис wp_enqueue_script:
wp_enqueue_script( string $handle, string $src = '', array $deps = array(), string|bool|null $ver = false, bool $in_footer = false )
Согласно вашему коду, это должно выглядеть так:
function load_css_js() {
wp_enqueue_style('gdgt-base-style', get_template_directory_uri() . '/css/gdgt-base.css');
wp_enqueue_style('gdgt-icon', get_template_directory_uri() . '/icons/css/gdgt.css');
wp_enqueue_script('gdgt-base-script', get_template_directory_uri() . '/js/gdgt-base.js', array( 'jquery' ) , '2019' true);
}
add_action('wp_enqueue_scripts', 'load_css_js');
[подробнее]: https://developer.wordpress.org/reference/functions/wp_enqueue_script/
документация для получения дополнительной информации.
