Когда использовать действие добавления ("инициализация") против действия добавления ("сценарии очереди wp")
В моей теме functions.php , Я вызываю add_action, чтобы получить определенную степень контроля над тем, где загружается jquery (в нижнем колонтитуле вместе с другими сценариями моей темы).
Проблема, с которой я сталкиваюсь, заключается в том, что когда я использую add_action ('wp_enqueue_scripts'), он срабатывает только в том случае, если плагины не загружены. Однако метод add_action ("инициализация") работает во всех случаях.
Я не могу вспомнить, почему, но я считаю, что add_action('wp_enqueue_scripts') предпочтительнее в это дело. Если это правда, как я могу заставить его работать во всех случаях?
В functions.php
//if(!is_admin()){add_action('init', 'my_theme_init');} //THIS WORKS ALL THE TIME
//add_action('wp_enqueue_scripts', 'my_theme_init'); //THIS ONLY WORKS WHEN NO PLUGINS PRESENT
if(!is_admin())
{
require_once(TEMPLATEPATH . '/functions_public.php');
}
В functions_public.php
function my_theme_init()
{
/* PREVENT DUPLICATE COPIES OF JQUERY FROM PLUGINS
**************************************************/
wp_deregister_script('jquery');
/* LOAD THE LOCAL WORDPRESS COPY OF JQUERY AND THEME CUSTOM SCRIPTS IN THE FOOTER
***********************************************/
wp_register_script('jquery', get_bloginfo('template_directory').'/scripts.mythemescripts.js',false,false,true);
wp_enqueue_script('jquery');
}
2-й метод, использующий add_action ('wp_enqueue_scripts'), по-видимому, не выполняется в условиях, когда присутствует плагин, который выписывает зависимости скрипта для темы.
2 answers
Многие разработчики плагинов делают все неправильно. правильный способ - зацепиться за wp_enqueue_scripts
, как вы пытаетесь сделать.
Однако вот порядок выполнения крючков в типичном намного больше
Дело в том, что нескольким разработчикам изначально было сказано подключиться к init
для постановки в очередь своих сценариев. Еще до того, как у нас появился крючок wp_enqueue_script
, это был "правильный" способ делать что-то, и учебные пособия, увековечивающие эту практику, все еще циркулируют в Интернете, развращая в противном случае хороших разработчиков.
Моя рекомендация состояла бы в том, чтобы разделить вашу функцию на две части. Делайте свое wp_deregister_script
/wp_register_script
на крючке init
и используйте крючок wp_enqueue_scripts
, когда вы действительно ставите в очередь jQuery.
Это поможет вам "делать все правильно" для постановки ваших сценариев в очередь и защитит вас от сотен разработчиков, которые все еще "делают это неправильно", заменив jQuery на вашу объединенную версию, прежде чем они добавят ее в очередь.
Вы также захотите добавить свой init
крючок с высоким приоритетом:
add_action( 'init', 'swap_out_jquery', 1 );
function swap_out_jquery() {
// ...
}
Здесь существует множество взаимосвязанных проблем.
- Правильный крючок действия, который следует использовать для постановки сценариев в очередь, - это
wp_enqueue_scripts
- Чтобы печатать сценарии в нижнем колонтитуле с помощью
wp_enqueue_script()
, установите параметр$footer
равнымtrue
- Ваши
add_action( $hook, $callback )
вызовы не должны быть ни во что завернуты; пусть они выполняются непосредственно изfunctions.php
- Вы должны поместить свои
is_admin()
условные проверки в свой обратный вызов - Вам не следует отменять регистрацию сценариев, связанных с ядром, из Тема, по любой причине. Даже если ваша цель - объединение сценариев, это Территория плагинов.
- Если вы должны отменить регистрацию jquery, то
wp_enqueue_scripts
слишком поздно. Разделите свой код отмены регистрации/регистрации на обратный вызов, подключенный кinit
. - Вызов некоторого другого скрипта "jquery" также, вероятно, не является хорошей практикой. Лучше всего было бы просто удалить jQuery из очереди, а затем загрузить свой пользовательский скрипт.
- Обязательно поставьте низкий приоритет при обратном вызове, поэтому вы переопределяете плагины
- Используйте
get_template_directory()
вместоTEMPLATEPATH
Собирая все это вместе:
<?php
function wpse55924_enqueue_scripts() {
if ( ! is_admin() ) {
// Dequeue jQuery
wp_dequeue_script( 'jquery' );
// Register/enqueue a custom script, that includes jQuery
wp_register_script( 'mythemescripts', get_template_directory_uri() . '/scripts.mythemescripts.js', false, false,true );
wp_enqueue_script( 'mythemescripts' );
}
}
add_action( 'wp_enqueue_scripts', 'wpse55924_enqueue_scripts', 99 );
Но опять же: это действительно не лучший подход. Ваш лучший выбор - просто удалить обратные вызовы плагина add_action(), которые отменяют регистрацию core jQuery, или использовать плагины, которые не делают что-то настолько безрассудное, как замена jQuery в комплекте с ядром.