Când să folosești add_action('init') vs add_action('wp_enqueue_scripts')

20 iun. 2012, 17:55:42
Vizualizări: 35.4K
Voturi: 11

Î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ă.

5
Comentarii

Te rog să nu înregistrezi propria ta copie a jQuery - folosește versiunea inclusă în WordPress, altfel vei ajunge să strici plugin-urile :)

Stephen Harris Stephen Harris
20 iun. 2012 18:02:30

Sunt de acord, de fapt folosesc cea inclusă în jQuery. Doar că o încarc într-un singur fișier .js (mythemescripts.js) împreună cu celelalte fișiere js de care are nevoie tema mea, pentru a reduce numărul de cereri HTTP.

N2Mystic N2Mystic
20 iun. 2012 18:11:11

În toate browserele, odată ce scriptul este solicitat de pe site-ul tău o dată, acesta este stocat în cache local. Vei avea cererea HTTP suplimentară doar la prima încărcare a paginii. Dacă combini toate scripturile într-unul singur, vei fi nevoit să modifici acest lucru de fiecare dată când WP lansează o actualizare cu o nouă versiune de jQuery. Asta înseamnă un coșmar de întreținere.

EAMann EAMann
20 iun. 2012 18:17:05

@EAMann, când tema este instalată pentru prima dată și de fiecare dată când pagina de opțiuni a temei mele este salvată ulterior, rescriu fișierul mythemescripts.js, încărcând cea mai recentă copie a bibliotecii jquery în el. Dacă utilizatorul actualizează versiunea WP, rutina mea de opțiuni pentru temă încarcă jquery-ul care vine cu acea versiune. Este întotdeauna la zi.

N2Mystic N2Mystic
20 iun. 2012 18:22:28

Problema persistă când un apel jquery este conținut în corpul documentului înainte de subsol. Se pare că jQuery(document).ready se declanșează înainte ca scriptul .js să fie încărcat în subsol.

N2Mystic N2Mystic
19 feb. 2014 19:53:19
Toate răspunsurile la întrebare 3
2
28

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

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.

Chip Bennett Chip Bennett
20 iun. 2012 18:51:54

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.

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

Există mai multe probleme aici, care sunt interconectate.

  1. Hook-ul corect de acțiune pentru a încărca scripturi este wp_enqueue_scripts
  2. Pentru a afișa scripturile în footer prin wp_enqueue_script(), setează parametrul $footer la true
  3. Apelurile tale add_action( $hook, $callback ) nu ar trebui să fie incluse în altceva; lasă-le să se execute direct din functions.php
  4. Ar trebui să plasezi condiționalul is_admin() în interiorul funcției callback
  5. 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.
  6. 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-ul init.
  7. 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.
  8. Asigură-te că folosești o prioritate mică pentru funcția ta callback, astfel încât să suprascrii Plugin-urile
  9. Folosește get_template_directory() în loc de TEMPLATEPATH

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.

20 iun. 2012 18:50:09
Comentarii

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.

EAMann EAMann
20 iun. 2012 18:59:14

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.

Chip Bennett Chip Bennett
20 iun. 2012 19:09:21
0

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ță.

22 oct. 2021 17:52:54