Quando utilizzare add_action('init') vs add_action('wp_enqueue_scripts')

20 giu 2012, 17:55:42
Visualizzazioni: 35.4K
Voti: 11

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.

5
Commenti

Per favore non registrare la tua copia di jQuery - usa la versione inclusa in WordPress, altrimenti rischi di rompere i plugin :)

Stephen Harris Stephen Harris
20 giu 2012 18:02:30

Concordo, infatti sto usando quella inclusa in jQuery. Sto semplicemente caricandola in un unico file .js (mythemescripts.js) insieme agli altri file js di cui ha bisogno il mio tema, per ridurre le richieste http.

N2Mystic N2Mystic
20 giu 2012 18:11:11

In tutti i browser, una volta che lo script viene richiesto dal tuo sito una volta, viene memorizzato nella cache locale. Avrai una richiesta HTTP aggiuntiva solo al primo caricamento della pagina. Se combini tutti gli script in uno solo, sarai costretto a modificarlo ogni volta che WP rilascia un aggiornamento con una nuova versione di jQuery. Questo == incubo di manutenzione.

EAMann EAMann
20 giu 2012 18:17:05

@EAMann, quando il tema viene installato per la prima volta, e ogni volta che la pagina delle opzioni del mio tema viene salvata successivamente, sto riscrivendo il file mythemescripts.js, caricando al suo interno la versione più recente della libreria jquery. Se l'utente aggiorna la propria versione di WP, la routine delle opzioni del mio tema carica la jquery fornita con quella versione. È sempre aggiornata.

N2Mystic N2Mystic
20 giu 2012 18:22:28

Il problema si verifica ancora quando una chiamata jquery è contenuta nel corpo del documento prima del footer. Apparentemente jQuery(document).ready viene attivato prima che lo script .js venga caricato nel footer.

N2Mystic N2Mystic
19 feb 2014 19:53:19
Tutte le risposte alla domanda 3
2
28

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() {
    // ...
}
20 giu 2012 18:38:40
Commenti

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.

Chip Bennett Chip Bennett
20 giu 2012 18:51:54

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.

Paul G. Paul G.
8 giu 2019 12:10:18
2

Ci sono diversi problemi qui, che sono correlati tra loro.

  1. L'hook di azione corretto per accodare gli script è wp_enqueue_scripts
  2. Per stampare gli script nel footer tramite wp_enqueue_script(), imposta il parametro $footer a true
  3. Le tue chiamate add_action( $hook, $callback ) non dovrebbero essere racchiuse in nulla; lasciale eseguire direttamente da functions.php
  4. Dovresti mettere i tuoi controlli condizionali is_admin() all'interno della tua callback
  5. 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.
  6. Se devi deregistrare jQuery, allora wp_enqueue_scripts è troppo tardi. Dividi il tuo codice di deregistrazione/registrazione in una callback agganciata a init.
  7. 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.
  8. Assicurati di impostare una priorità bassa sulla tua callback, in modo da sovrascrivere i Plugin
  9. Usa get_template_directory() invece di TEMPLATEPATH

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.

20 giu 2012 18:50:09
Commenti

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.

EAMann EAMann
20 giu 2012 18:59:14

È 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.

Chip Bennett Chip Bennett
20 giu 2012 19:09:21
0

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.

22 ott 2021 17:52:54