Când să folosești add_action('init') vs add_action('wp_enqueue_scripts')
În fișierul functions.php al temei mele, folosesc add_action pentru a avea un control asupra locului unde este încărcat jQuery (în footer împreună cu celelalte scripturi ale temei).
Problema pe care o întâmpin este că atunci când folosesc add_action('wp_enqueue_scripts'), pare să funcționeze doar dacă nu sunt încărcate plugin-uri. În schimb, metoda add_action('init') funcționează în toate cazurile.
Nu-mi amintesc exact de ce, dar cred că add_action('wp_enqueue_scripts') este preferată în acest caz. Dacă este adevărat, cum pot face să funcționeze în toate cazurile?
În functions.php
//if(!is_admin()){add_action('init', 'my_theme_init');} //ACEASTA FUNCȚIONEAZĂ ÎNTOTDEAUNA
//add_action('wp_enqueue_scripts', 'my_theme_init'); //ACEASTA FUNCȚIONEAZĂ DOAR CÂND NU SUNT PLUGIN-URI PREZENTE
if(!is_admin())
{
require_once(TEMPLATEPATH . '/functions_public.php');
}
În functions_public.php
function my_theme_init()
{
/* PREVINE COPII DUPLICATE ALE JQUERY DIN PLUGIN-URI
**************************************************/
wp_deregister_script('jquery');
/* ÎNCARCĂ COPIA LOCALĂ WORDPRESS A JQUERY ȘI SCRIPTURILE PERSONALIZATE ALE TEMEI ÎN FOOTER
***********************************************/
wp_register_script('jquery', get_bloginfo('template_directory').'/scripts.mythemescripts.js',false,false,true);
wp_enqueue_script('jquery');
}
A doua metodă, folosind add_action('wp_enqueue_scripts') aparent nu este executată în condițiile în care există un plugin prezent care scrie dependențe de scripturi pentru temă.

Mulți dezvoltatori de plugin-uri nu fac lucrurile corect. Modul corect este să folosești hook-ul wp_enqueue_scripts
, așa cum încerci să faci.
Cu toate acestea, iată ordinea în care rulează hook-urile într-o cerere tipică:
- muplugins_loaded
- registered_taxonomy
- registered_post_type
- plugins_loaded
- sanitize_comment_cookies
- setup_theme
- load_textdomain
- after_setup_theme
- auth_cookie_malformed
- auth_cookie_valid
- set_current_user
- init
- 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
- ... și multe altele
Problema este că mulți dezvoltatori au fost instruiți inițial să folosească hook-ul init
pentru a încărca scripturile. Înainte să avem hook-ul wp_enqueue_script
, acesta era modul "corect" de a face lucrurile, iar tutorialele care perpetuau această practică sunt încă prezent pe internet, corupând alți dezvoltatori altfel buni.
Recomandarea mea ar fi să împărți funcția ta în două părți. Folosește wp_deregister_script
/wp_register_script
pe hook-ul init
și folosește hook-ul wp_enqueue_scripts
atunci când încarci efectiv jQuery.
Acest lucru te va menține în lumea "facerii lucrurilor corect" pentru încărcarea scripturilor și te va proteja de sutele de dezvoltatori care încă "fac greșit" prin înlocuirea jQuery cu versiunea ta concatenată înainte de a o adăuga în coadă.
De asemenea, vei dori să adaugi hook-ul init
cu o prioritate ridicată:
add_action( 'init', 'swap_out_jquery', 1 );
function swap_out_jquery() {
// ...
}

Am să recomand asta, dar apoi mi-am dat seama că OP de fapt deregistra jQuery, și apoi înregistra un script complet diferit și îl numea "jquery". Nu cred că aceasta este o practică bună de încurajat, și cred că o abordare mai bună ar fi să elimini complet jQuery din coadă, și apoi să adaugi scriptul personalizat folosind un handle personalizat.

Un aspect de remarcat despre priority
(prioritatea) adăugării acțiunilor. Totul depinde de cum interpretezi prioritatea. Dacă vrei ca funcția ta să ruleze "primul", atunci un număr mai mic este mai bun - o prioritate mai mare în ordinea de execuție. Dar dacă vrei ca efectul funcției tale să aibă prioritate față de altele, vei dori să ruleze mai târziu - deci o prioritate mai mare din punct de vedere al "efectului". Și în acest caz, probabil că vei dori un număr mai mare. Chiar dacă nu prea are sens să înlocuiești versiunea RTM a jquery, așa cum sugerează comentariul anterior.

Există mai multe probleme aici, care sunt interconectate.
- Hook-ul corect de acțiune pentru a încărca scripturi este
wp_enqueue_scripts
- Pentru a afișa scripturile în footer prin
wp_enqueue_script()
, setează parametrul$footer
latrue
- Apelurile tale
add_action( $hook, $callback )
nu ar trebui să fie incluse în altceva; lasă-le să se execute direct dinfunctions.php
- Ar trebui să plasezi condiționalul
is_admin()
în interiorul funcției callback - Nu ar trebui să deregistrezi scripturile incluse în nucleu din cadrul unei teme, indiferent de motiv. Chiar și dacă scopul tău este concatenarea scripturilor, acesta este terenul Plugin-urilor.
- Dacă trebuie neapărat să deregistrezi jquery, atunci
wp_enqueue_scripts
este prea târziu. Separa codul de deregistrare/înregistrare într-o funcție callback legată la hook-ulinit
. - Denumirea unui alt script "jquery" nu este, de asemenea, o practică bună. Soluția mai bună ar fi să elimini jQuery din coadă, și apoi să încarci scriptul tău personalizat.
- Asigură-te că folosești o prioritate mică pentru funcția ta callback, astfel încât să suprascrii Plugin-urile
- Folosește
get_template_directory()
în loc deTEMPLATEPATH
Punând totul laolaltă:
<?php
function wpse55924_enqueue_scripts() {
if ( ! is_admin() ) {
// Elimină jQuery din coadă
wp_dequeue_script( 'jquery' );
// Înregistrează/încară un script personalizat, care include 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 );
Dar repet: aceasta nu este cu adevărat cea mai bună abordare. Soluția mai bună este pur și simplu să elimini apelurile add_action() din Plugin-uri care deregistrează jQuery-ul din nucleu - sau să folosești Plugin-uri care nu fac ceva atât de riscant precum înlocuirea jQuery-ului inclus în nucleu.

OP combină versiunea de jQuery distribuită de WP cu alte scripturi programatic, astfel încât tema să facă o singură solicitare HTTP pentru a încărca toate fișierele JS. Deci, scripturile personalizate conțin jQuery și nu vor strica nimic dacă sunt încărcate în acest fel. Suprascrierea handler-ului înregistrat 'jquery' este necesară pentru a preveni încărcarea de două ori a jQuery - o dată în fișierul JS combinat și din nou de către orice plugin care încearcă să încarce jQuery pe cont propriu.

Este semantic și practic _doing_it_wrong()
să numești ceva care nu este doar jQuery "jQuery". De asemenea: jQuery poate fi pur și simplu dequeued pentru a asigura că nu este încărcat de două ori. Apelul wp_dequeue_script()
trebuie să se întâmple cu o prioritate suficientă pentru a se asigura că nimic nu îl încarcă ulterior.

Acest răspuns nu este exact pentru întrebarea ta, dar există o altă problemă în codul tău.
Nu trebuie și nici nu ar trebui să folosești:
wp_enqueue_script('jquery');
Dacă dorești să folosești jQuery furnizat de WordPress, cel mai bun mod de a face acest lucru este să îl treci ca dependență atunci când încarci fișierul tău JavaScript. În acest fel, WordPress se va ocupa de încărcarea lui și nu va trebui să-l încarci manual.
Exemplu:
wp_enqueue_script( 'myjslib-handle', get_stylesheet_directory_uri() . '/js/myfile.js', array('jquery'), '1.0.0', true );
array('jquery') în codul de mai sus este parametrul necesar pentru a încărca jQuery ca dependență.
