wp_enqueue_script() совсем не работает

23 дек. 2014 г., 22:16:36
Просмотры: 70.2K
Голосов: 9

Я пытаюсь подключить 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 из другого источника - всё работает. Что может вызывать эту проблему? Спасибо за помощь!

0
Все ответы на вопрос 3
12
14

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' );

Для получения дополнительной информации ознакомьтесь с документацией по каждой функции в кодексе.

23 дек. 2014 г. 22:30:39
Комментарии

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

DON TOLIVER DON TOLIVER
23 дек. 2014 г. 22:37:57

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

Robert hue Robert hue
23 дек. 2014 г. 22:41:57

Я отредактировал комментарий. Пожалуйста, прочтите его :)

DON TOLIVER DON TOLIVER
23 дек. 2014 г. 22:42:50

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

Robert hue Robert hue
23 дек. 2014 г. 22:46:13

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

DON TOLIVER DON TOLIVER
23 дек. 2014 г. 22:50:41

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

Robert hue Robert hue
23 дек. 2014 г. 22:51:00

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

DON TOLIVER DON TOLIVER
23 дек. 2014 г. 22:55:15

Рад был помочь. :)

Robert hue Robert hue
23 дек. 2014 г. 22:57:37

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

DON TOLIVER DON TOLIVER
23 дек. 2014 г. 23:01:33

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

Robert hue Robert hue
23 дек. 2014 г. 23:08:09

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

Brad Dalton Brad Dalton
9 июл. 2015 г. 04:01:48

Вы можете просто привыкнуть писать jQuery вместо $ всегда, и тогда у вас вообще не будет этой проблемы. Вам также не понадобятся хаки или дополнительные замыкания для решения несуществующей проблемы.

mopsyd mopsyd
29 мар. 2018 г. 09:54:51
Показать остальные 7 комментариев
0

Для таких же идиотов, как я, решил поделиться здесь. :-)

Я только что потратил час, потому что написал 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 помог мне найти решение.

8 янв. 2019 г. 19:43:42
0

При регистрации и подключении скриптов не обязательно вызывать 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/
документация для получения дополнительной информации.

8 янв. 2019 г. 22:21:03