Коли використовувати додавання ('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.