Quando utilizzare add_action('init') vs add_action('wp_enqueue_scripts')
Nel file functions.php del mio tema, sto usando add_action per controllare dove viene caricato jQuery (nel footer insieme agli altri script del tema).
Il problema che sto riscontrando è che quando uso add_action('wp_enqueue_scripts'), sembra funzionare solo se non ci sono plugin caricati. Tuttavia, il metodo add_action('init') funziona in tutti i casi.
Non ricordo esattamente perché, ma credo che add_action('wp_enqueue_scripts') sia preferibile in questo caso. Se è vero, come posso farlo funzionare in tutte le situazioni?
Nel file functions.php
//if(!is_admin()){add_action('init', 'my_theme_init');} //QUESTO FUNZIONA SEMPRE
//add_action('wp_enqueue_scripts', 'my_theme_init'); //QUESTO FUNZIONA SOLO SENZA PLUGIN
if(!is_admin())
{
require_once(TEMPLATEPATH . '/functions_public.php');
}
Nel file functions_public.php
function my_theme_init()
{
/* PREVIENI COPIE DUPLICATE DI JQUERY DAI PLUGIN
**************************************************/
wp_deregister_script('jquery');
/* CARICA LA COPIA LOCALE DI JQUERY DI WORDPRESS E GLI SCRIPT PERSONALIZZATI DEL TEMA NEL FOOTER
***********************************************/
wp_register_script('jquery', get_bloginfo('template_directory').'/scripts.mythemescripts.js',false,false,true);
wp_enqueue_script('jquery');
}
Il secondo metodo, che usa add_action('wp_enqueue_scripts'), apparentemente non viene eseguito quando è presente un plugin che scrive dipendenze di script nel tema.

Molti sviluppatori di plugin non seguono il modo corretto di fare le cose. Il modo corretto è agganciarsi a wp_enqueue_scripts
come stai cercando di fare.
Tuttavia, ecco l'ordine degli hook eseguiti in una tipica richiesta:
- 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
- ... molti altri
Il punto è che a molti sviluppatori è stato inizialmente detto di agganciarsi a init
per accodare i loro script. Prima che avessimo un hook wp_enqueue_script
, quello era il modo "corretto" di fare le cose, e i tutorial che perpetuano questa pratica sono ancora in giro su Internet, corrompendo sviluppatori altrimenti bravi.
La mia raccomandazione sarebbe di dividere la tua funzione in due parti. Esegui wp_deregister_script
/wp_register_script
sull'hook init
e usa l'hook wp_enqueue_scripts
quando effettivamente accodi jQuery.
Questo ti manterrà nel mondo del "fare le cose bene" per l'accodamento degli script e ti proteggerà dalle centinaia di sviluppatori che ancora "fanno le cose male" sostituendo jQuery con la tua versione concatenata prima che venga aggiunta alla coda.
Dovresti anche aggiungere il tuo hook init
con una priorità alta:
add_action( 'init', 'swap_out_jquery', 1 );
function swap_out_jquery() {
// ...
}

Stavo per consigliare questo, ma poi ho realizzato che l'OP stava effettivamente deregistrando jQuery, e poi registrando un script completamente diverso chiamandolo "jquery". Non penso che sia una buona pratica da incoraggiare, e credo che una soluzione migliore sarebbe semplicemente rimuovere jQuery dalla coda, e poi accodare lo script personalizzato usando un handle personalizzato.

Da notare riguardo alla priority
nell'aggiunta di azioni. Tutto dipende da come si intende la priorità. Se vuoi che la tua funzione venga eseguita "per prima", allora un numero più basso è meglio - una priorità più alta nell'ordine della coda di esecuzione. Ma se vuoi che l'effetto della tua funzione abbia la precedenza sulle altre, vorrai che venga eseguita dopo - quindi una priorità più alta per "effetto". E in questo caso, probabilmente vorrai un numero più alto. Anche se c'è poco vantaggio nel sostituire la versione RTM di jquery, come suggerisce il commento precedente.

Ci sono diversi problemi qui, che sono correlati tra loro.
- L'hook di azione corretto per accodare gli script è
wp_enqueue_scripts
- Per stampare gli script nel footer tramite
wp_enqueue_script()
, imposta il parametro$footer
atrue
- Le tue chiamate
add_action( $hook, $callback )
non dovrebbero essere racchiuse in nulla; lasciale eseguire direttamente dafunctions.php
- Dovresti mettere i tuoi controlli condizionali
is_admin()
all'interno della tua callback - Non dovresti deregistrare gli script inclusi nel core da un Tema, per nessun motivo. Anche se il tuo scopo è la concatenazione degli script, quello è territorio dei Plugin.
- Se devi deregistrare jQuery, allora
wp_enqueue_scripts
è troppo tardi. Dividi il tuo codice di deregistrazione/registrazione in una callback agganciata ainit
. - Chiamare qualche altro script "jquery" probabilmente non è nemmeno una buona pratica. La soluzione migliore sarebbe semplicemente rimuovere jQuery dalla coda, e poi caricare il tuo script personalizzato.
- Assicurati di impostare una priorità bassa sulla tua callback, in modo da sovrascrivere i Plugin
- Usa
get_template_directory()
invece diTEMPLATEPATH
Mettendo tutto insieme:
<?php
function wpse55924_enqueue_scripts() {
if ( ! is_admin() ) {
// Rimuovi jQuery dalla coda
wp_dequeue_script( 'jquery' );
// Registra/accoda uno script custom, che 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 );
Ma ripeto: questo non è davvero l'approccio migliore. La soluzione migliore è semplicemente rimuovere le callback add_action() dei plugin che deregistrano jQuery del core - o usare Plugin che non fanno qualcosa di così avventato come sostituire jQuery incluso nel core.

L'OP sta combinando la versione di jQuery distribuita da WP con altri script in modo programmatico, in modo che il suo tema effettui una sola richiesta HTTP per caricare tutti i file JS. Quindi gli script personalizzati contengono effettivamente jQuery e non causeranno problemi se caricati in questo modo. Sovrascrivere l'handle 'jquery' registrato è necessario per evitare il caricamento doppio di jQuery - una volta nel file JS combinato e un'altra volta da eventuali plugin che tentano di accodare jQuery autonomamente.

È semanticamente e praticamente _doing_it_wrong()
chiamare qualcosa che non è solo jQuery con il nome "jQuery". Inoltre: jQuery stesso può semplicemente essere dequeue per assicurarsi che non venga caricato due volte. La chiamata wp_dequeue_script()
deve semplicemente avvenire con una priorità sufficiente per garantire che nulla lo accodi successivamente.

Questa risposta non è esattamente per la tua domanda, ma c'è un altro problema nel tuo codice.
Non hai mai bisogno di usare e non dovresti usare:
wp_enqueue_script('jquery');
Se vuoi utilizzare jQuery fornito da WordPress, il modo migliore è, quando carichi il tuo file JavaScript, passare jQuery come dipendenza. In questo modo, sarà gestito da WordPress stesso e non dovrai caricarlo manualmente.
Esempio:
wp_enqueue_script( 'myjslib-handle', get_stylesheet_directory_uri() . '/js/myfile.js', array('jquery'), '1.0.0', true );
array('jquery') nel codice sopra è il parametro di cui abbiamo bisogno per caricare jQuery come dipendenza.
