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


10

Nelle funzioni.php del mio tema, sto chiamando add_action per ottenere una misura di controllo su dove è caricato jquery (nel piè di pagina insieme agli altri script del mio tema).

Il problema che sto riscontrando è che quando uso add_action ('wp_enqueue_scripts'), sembra funzionare solo se non sono caricati plugin. Tuttavia, il metodo add_action ('init') funziona in tutti i casi.

Non ricordo il perché, ma credo che add_action ('wp_enqueue_scripts') sia preferito in questo caso. Se questo è vero, come posso farlo funzionare in tutti i casi?

In Functions.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');   
}

In Functions_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');

}

Il secondo metodo, usando add_action ('wp_enqueue_scripts') apparentemente non viene eseguito in condizioni in cui è presente un plugin che scrive le dipendenze degli script sul tema.


5
Per favore non registrare la tua copia di jquery - usa la versione fornita con WordPress, altrimenti finirai per rompere i plug-in :)
Stephen Harris,

Sono d'accordo, in realtà sto usando quello fornito con jQuery. Lo sto solo caricando in un singolo .js (mythemescripts.js) insieme agli altri file js di cui il mio tema ha bisogno, al fine di ridurre le richieste http.
N2Mystic,

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

2
@EAMann, quando il tema viene installato per la prima volta, e ogni volta che la mia pagina delle opzioni del tema viene successivamente salvata, riscrivo mythemescripts.js, caricando al suo interno l'ultima copia della libreria jquery. Se l'utente aggiorna la sua versione di WP, la mia routine delle opzioni del tema carica il jquery che ne deriva. È sempre aggiornato.
N2Mystic,

Il problema si verifica ancora quando una chiamata jquery è contenuta nel corpo del documento prima del piè di pagina. Apparentemente jQuery (documento). Viene già attivato prima che lo script .js venga caricato nel piè di pagina.
N2Mystic,

Risposte:


26

Molti sviluppatori di plugin non fanno le cose nel modo giusto. Il modo giusto è agganciarsi a wp_enqueue_scriptscome stai cercando di fare.

Tuttavia, ecco l'ordine degli hook eseguiti in una richiesta tipica:

  • 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
  • dentro
  • 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
  • ... molto più

Il fatto è che molti sviluppatori inizialmente avevano detto di agganciarsi initper accodare i loro script. Prima di avere un wp_enqueue_scriptgancio, quello era il modo "corretto" di fare le cose, e tutorial che perpetuavano la pratica stanno ancora fluttuando su Internet, corrompendo gli sviluppatori altrimenti bravi.

La mia raccomandazione sarebbe di dividere la funzione in due parti. Esegui il tuo wp_deregister_script/ wp_register_scriptsul initgancio e usa il wp_enqueue_scriptsgancio quando accoda effettivamente jQuery.

Questo ti terrà nel mondo del "farlo nel modo giusto" per accodare i tuoi script e ti aiuterà a proteggerti dalle centinaia di sviluppatori che "fanno ancora male" scambiando jQuery con la tua versione concatenata prima di aggiungerlo alla coda .

Ti consigliamo inoltre di aggiungere il tuo inithook con un'alta priorità:

add_action( 'init', 'swap_out_jquery', 1 );
function swap_out_jquery() {
    // ...
}

2
Stavo per consigliarlo, ma poi mi sono reso conto che l'OP stava effettivamente cancellando jQuery, quindi registrando completamente uno script diverso e chiamandolo "jquery". Non penso che sia una buona pratica incoraggiare, e penso che una strada migliore sarebbe semplicemente accodare completamente jQuery e quindi accodare lo script personalizzato usando un handle personalizzato .
Chip Bennett,

Indica prioritydi aggiungere delle azioni. Tutto dipende da come vedi la priorità. Se vuoi che il tuo venga eseguito "prima", allora è meglio un numero più basso - una priorità più alta nell'ordine della coda di esecuzione. Ma se vuoi che l'effetto della tua funzione abbia la precedenza sugli altri, vorrai che venga eseguito in seguito, quindi una priorità più alta per "effetto". E in questo caso, probabilmente è un numero più alto che vorresti. Anche se c'è poco merito nello scambiare la versione RTM di jquery, come suggerisce il commentatore precedente.
Paul G.

3

Ci sono più problemi qui, che sono correlati.

  1. Il gancio di azione corretto da usare per accodare gli script è wp_enqueue_scripts
  2. Per stampare gli script nel piè di pagina tramite wp_enqueue_script(), impostare il $footerparametro sutrue
  3. Le tue add_action( $hook, $callback )chiamate non dovrebbero essere racchiuse in nulla; lasciarli eseguire direttamente dafunctions.php
  4. È necessario inserire i is_admin()controlli condizionali all'interno del callback
  5. Non devi annullare la registrazione di script raggruppati nel core da un tema, per qualsiasi motivo. Anche se il tuo scopo è la concatenazione di script, questo è il territorio del plugin .
  6. Se devi annullare la registrazione di jquery, wp_enqueue_scriptsè troppo tardi . Dividi il tuo codice di annullamento / registrazione in un callback collegato init.
  7. Chiamare qualche altra sceneggiatura "jquery" probabilmente non è una buona pratica. La tua scommessa migliore sarebbe semplicemente dequeue jQuery e quindi caricare il tuo script personalizzato.
  8. Assicurati di impostare una priorità bassa sul callback, in modo da sostituire i plug-in
  9. Usa get_template_directory()piuttosto cheTEMPLATEPATH

Mettere tutto insieme:

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

Ma ancora: questo non è davvero l'approccio migliore. La tua scommessa migliore è semplicemente rimuovere i callback plug-in add_action () che cancellano la registrazione di jQuery di base - o usare plug-in che non fanno qualcosa di così spericolato come sostituire jQuery di base.


L'OP sta combinando la versione distribuita dal WP di jQuery con alcuni altri script a livello di codice in modo che il suo tema faccia una sola richiesta HTTP per caricare tutti i file JS. Quindi gli script personalizzati contengono jQuery e non si romperanno nulla se caricati in questo modo. La sovrascrittura dell'handle "jquery" registrato è necessaria per impedire il caricamento di jQuery due volte, una volta nel file JS combinato e di nuovo da eventuali plug-in che tentano di accodare jQuery da soli.
EAMann,

È semanticamente e praticamente _doing_it_wrong()chiamare qualcosa che non è solo jQuery "jQuery". Inoltre: jQuery stesso può essere semplicemente rimosso dalla coda per garantire che non venga caricato due volte. La wp_dequeue_script()chiamata deve semplicemente avvenire con una priorità sufficiente per garantire che nulla la accluda in seguito.
Chip Bennett,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.