Когда использовать действие добавления ("инициализация") против действия добавления ("сценарии очереди 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'), по-видимому, не выполняется в условиях, когда присутствует плагин, который выписывает зависимости скрипта для темы.

Author: N2Mystic, 2012-06-20

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() {
    // ...
}
 27
Author: EAMann, 2012-06-20 15:38:40

Здесь существует множество взаимосвязанных проблем.

  1. Правильный крючок действия, который следует использовать для постановки сценариев в очередь, - это wp_enqueue_scripts
  2. Чтобы печатать сценарии в нижнем колонтитуле с помощью wp_enqueue_script(), установите параметр $footer равным true
  3. Ваши add_action( $hook, $callback ) вызовы не должны быть ни во что завернуты; пусть они выполняются непосредственно из functions.php
  4. Вы должны поместить свои is_admin() условные проверки в свой обратный вызов
  5. Вам не следует отменять регистрацию сценариев, связанных с ядром, из Тема, по любой причине. Даже если ваша цель - объединение сценариев, это Территория плагинов.
  6. Если вы должны отменить регистрацию jquery, то wp_enqueue_scripts слишком поздно. Разделите свой код отмены регистрации/регистрации на обратный вызов, подключенный к init.
  7. Вызов некоторого другого скрипта "jquery" также, вероятно, не является хорошей практикой. Лучше всего было бы просто удалить jQuery из очереди, а затем загрузить свой пользовательский скрипт.
  8. Обязательно поставьте низкий приоритет при обратном вызове, поэтому вы переопределяете плагины
  9. Используйте 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 в комплекте с ядром.

 3
Author: Chip Bennett, 2012-06-20 15:50:09