Коли використовувати додавання ('init') проти добавлення ('wp_enqueue_scripts')


10

У своїй темі function.php я закликаю адділлер, щоб отримати міру контролю над тим, де завантажується jquery (у нижньому колонтитулі разом з іншими сценаріями моєї теми).

Проблема, яка у мене виникає, полягає в тому, що, коли я використовую додавання ('wp_enqueue_scripts'), він видається, якщо він не працює, якщо плагіни не завантажені. Однак метод addgery ('init') працює у всіх випадках.

Я не можу згадати чому, але я вважаю, що в цьому випадку кращим є додавання ('wp_enqueue_scripts'). Якщо це правда, як я можу змусити її працювати у всіх випадках?

У function.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');   
}

У function_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-й метод, використовуючи додавання ('wp_enqueue_scripts'), очевидно, не виконується в умовах, коли присутній плагін, який записує залежності сценарію до теми.


5
Будь ласка, не реєструйте власну копію jquery - використовуйте версію, що постачається з WordPress, інакше ви зламаєте плагіни :)
Стівен Харріс

Я погоджуюся, я фактично використовую той, який постачається з jQuery. Я просто завантажую його в один .js (mythemescripts.js) разом з іншими файлами js, які потрібні моїй темі, щоб зменшити запити http.
N2Mystic

У всіх браузерах, як тільки один раз запитується сценарій з вашого сайту, він кешується локально. У вас буде додатковий запит HTTP лише під час завантаження на першій сторінці. Якщо ви об'єднаєте всі сценарії в один, ви будете змушені змінювати це кожен раз, коли WP випускає оновлення з новою версією jQuery. Це == кошмар технічного обслуговування.
EAMann

2
@EAMann, коли тема вперше встановлена, і кожного разу, коли моя сторінка параметрів теми після цього зберігається, я переписую mythemescripts.js, завантажуючи в неї останню копію бібліотеки jquery. Якщо користувач оновлює свою версію WP, мої параметри теми завантажують jquery, що додається до цього. Його завжди актуально.
N2Mystic

Проблема все ще виникає, коли виклик jquery міститься в тілі документа перед колонтитулом. Мабуть, jQuery (документ) вже запускається перед .js-скриптом завантажується в колонтитул.
N2Mystic

Відповіді:


26

Багато розробників плагінів не роблять справи правильно. Правий шлях зачепити , щоб , wp_enqueue_scriptsяк ви намагаєтеся зробити.

Однак ось порядок гачків виконується в типовому запиті:

  • muplugins_loaded
  • зареєстрована_таксономія
  • register_post_type
  • плагіни_завантажені
  • sanitize_comment_cookies
  • setup_theme
  • load_textdomain
  • after_setup_theme
  • auth_cookie_malformed
  • auth_cookie_valid
  • set_current_user
  • у цьому
  • widgets_init
  • register_sidebar
  • wp_register_sidebar_widget
  • wp_default_scripts
  • wp_default_stypes
  • admin_bar_init
  • add_admin_bar_menus
  • wp_loaded
  • parse_request
  • send_headers
  • parse_query
  • pre_get_posts
  • posts_selection
  • wp
  • template_redirect
  • get_header
  • wp_head
  • wp_enqueue_scripts
  • wp_print_styles
  • wp_print_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() {
    // ...
}

2
Я збирався рекомендувати це, але потім зрозумів, що ОП фактично скасовує реєстрацію jQuery, а потім повністю зареєстрував інший скрипт і назвав його "jquery". Я не думаю, що це хороша практика заохочувати, і вважаю, що кращим маршрутом було б просто відмовитись від jQuery повністю , а потім застосувати користувальницький сценарій за допомогою користувацької ручки .
Чіп Беннетт

Зверніть увагу на priorityдодавання дій. Все залежить від того, як ви бачите пріоритет. Якщо ви хочете, щоб ваш запускався "спочатку", тоді краще нижче число - більший пріоритет у порядку черги виконання. Але якщо ви хочете, щоб ефект вашої функції мав перевагу над іншими, ви хочете, щоб вона працювала пізніше - тому більш високий пріоритет за ефектом. І в цьому випадку це, мабуть, більша кількість, яку б ви хотіли. Навіть незважаючи на те, що в заміні RTM-версії jquery мало що заслуговує на увагу, як це пропонує попередній коментатор.
Пол Дж.

3

Тут є кілька питань, які взаємопов'язані.

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

Але знову ж таки: це насправді не найкращий підхід. Вашою кращою ставкою є просто видалити зворотні виклики плагіну addgery (), які відміняють основні jQuery - або використовувати додатки, які не роблять щось настільки безрозсудливо, як заміна jQuery з пакетним пакетом.


ОП поєднує програмно розроблену WP версію jQuery з деякими іншими сценаріями програмно, так що його тема робить лише один запит HTTP, щоб завантажити всі файли JS. Таким чином, користувацькі сценарії містять jQuery і нічого не порушують, якщо завантажуються таким чином. Переписування зареєстрованої ручки 'jquery' необхідно для запобігання завантаженню jQuery двічі - один раз у комбінований файл JS і знову будь-якими плагінами, які намагаються самостійно запускати jQuery.
EAMann

Семантично і практично _doing_it_wrong()називати те, що є не просто jQuery, "jQuery". Також: jQuery можна просто відмовитись , щоб переконатися, що він не завантажується двічі. wp_dequeue_script()Виклик просто має відбутися з достатнім пріоритетом , щоб забезпечити , що ніщо його ставить в чергу пізніше.
Чіп Беннетт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.