De ce wp_register_style() este important când folosesc wp_enqueue_style() complet?

25 nov. 2013, 08:29:18
Vizualizări: 30.3K
Voturi: 24

În prezent lucrez la o temă și am făcut câteva includeri de stiluri și scripturi. Când am inclus scripturile, am folosit mai întâi wp_register_script() și apoi le-am încărcat cu wp_enqueue_script() - pentru că am înțeles că acesta este modul corect de a include scripturile. Dar pentru includerea stilurilor, am folosit doar wp_enqueue_style() cu toți parametrii săi. Dar tocmai am primit un răspuns de la s_ha_dum spunând că folosirea wp_register_style() ar face tema prietenoasă cu temele copil - mă întreb, fără wp_register_style() folosesc doar wp_enqueue_style() și tema mea funcționează bine cu stilurile incluse. Le-am inclus astfel:

add_action( 'wp_enqueue_scripts', 'wpse20131025_styles' );

function wpse20131025_styles(){

    wp_enqueue_style( 'site-styles', get_template_directory_uri() . '/style.css', '', '', 'screen' );
    wp_enqueue_style( 'menu-styles', get_template_directory_uri() . '/css/menu.css', '', '', 'screen and (min-device-width: 800px)' );
    wp_enqueue_style( 'mobile-menu-styles', get_template_directory_uri() . '/css/mobile-menu.css', '', '', 'screen and (max-device-width: 799px)' );

}

În timp ce wp_enqueue_style() are toți parametrii prezenți în wp_register_style() ($handle, $src, $deps, $ver, $media) atunci de ce ar trebui să îi repet? Sau, care este exact scopul lui wp_register_style() în afară de wp_enqueue_style()?

0
Toate răspunsurile la întrebare 1
4
41

În primul rând, să menționăm că în ceea ce privește aceste funcții, ceea ce este valabil pentru stiluri este exact valabil și pentru scripturi, dar există unele excepții opuse, explicate în răspuns.

Diferența principală între funcțiile wp_enqueue_* și respectiv wp_register_* este că prima adaugă scripturi/stiluri în coadă, iar cea de-a doua pregătește scripturi/stiluri pentru a fi adăugate.

Probabil deja știi asta, dar există o a doua diferență; wp_register_* poate fi folosită în orice hook, chiar și într-un hook timpuriu precum init, dar wp_enqueue_* ar trebui folosită pe hook-ul wp_enqueue_scripts (sau admin_enqueue_scripts pentru backend) 1.

Scenariul tipic de utilizare a ambelor funcții este atunci când dorești să înregistrezi scripturi/stiluri la inițializarea temei și apoi să le adaugi condiționat pe anumite pagini, de exemplu:

add_action('init', 'my_register_styles');

function my_register_styles() {
    wp_register_style( 'style1', get_template_directory_uri() . '/style1.css' );
    wp_register_style( 'style2', get_template_directory_uri() . '/style2.css' );
    wp_register_style( 'style3', get_template_directory_uri() . '/style3.css' );
}

add_action( 'wp_enqueue_scripts', 'my_enqueue_styles' );

function my_enqueue_styles() {
    if ( is_front_page() ) {
        wp_enqueue_style( 'style3' );
    } elseif ( is_page_template( 'special.php' ) ) {
        wp_enqueue_style( 'style1' );
        wp_enqueue_style( 'style2' );
    } else {
        wp_enqueue_style( 'style1' );
    }
}

În acest fel, adăugarea condiționată este mai lizibilă și mai puțin verbosă.

În plus, dacă dorești să adaugi unul sau mai multe dintre stilurile/scripturile înregistrate și în backend, poți folosi handle-ul înregistrat într-o funcție care folosește hook-ul admin_enqueue_scripts fără a fi nevoie să transmiți toți parametrii din nou.

Desigur, acest lucru este mai util pentru scripturi, datorită wp_localize_script care în scenariul anterior poate fi apelat o singură dată, după înregistrarea scriptului, iar apoi la adăugarea condiționată doar să adaugi scriptul, chiar dacă este folosit de mai multe ori: acest lucru păstrează codul mai simplu și DRY.

Când înregistrezi un script/stil și imediat după îl adaugi, este doar o sarcină inutilă, care poate fi complet evitată:

wp_register_style( 'style1', get_template_directory_uri() . '/style1.css' );
wp_enqueue_style( 'style1' );

Nu există niciun avantaj în a adăuga un stil (sau script) în acest fel, folosește pur și simplu wp_enqueue_style cu toți parametrii wp_enqueue_style și ai terminat.

Afirmația anterioară este valabilă și în ceea ce privește compatibilitatea cu temele copil. Pentru a suprascrie un stil în tema copil, când părintele folosește wp_register_style urmat imediat de wp_enqueue_style, trebuie să dezînregistrezi stilul și să-l înregistrezi din nou cu un alt URL. Dacă părintele folosește doar wp_enqueue_style, în tema copil poți folosi wp_dequeue_style și să adaugi noul stil, deci în tema copil ai nevoie de 2 linii de cod în ambele cazuri.

Cu toate acestea, ceea ce este foarte prietenos cu temele copil este să înfășori funcțiile care adaugă și/sau înregistrează stiluri și scripturi într-un if ( ! function_exists( ... în acest fel, tema copil poate suprascrie stilurile și scripturile temei părinte într-un singur loc:

if ( ! function_exists( 'my_register_styles' ) ) {
    function my_register_styles() {
        wp_register_style( 'style1', get_template_directory_uri() . '/style1.css' );
        wp_register_style( 'style2', get_template_directory_uri() . '/style2.css' );
        wp_register_style( 'style3', get_template_directory_uri() . '/style3.css' );
    }
}

if ( ! function_exists( 'my_enqueue_styles ') ) {
    function my_enqueue_styles() {
        if ( is_front_page() ) {
            wp_enqueue_style( 'style3' );
        } elseif ( is_page_template( 'special.php' ) ) {
            wp_enqueue_style( 'style1' );
            wp_enqueue_style( 'style2' );
        } else {
            wp_enqueue_style( 'style1' );
        }
    }
}

Acum, în tema copil este posibil să scrii o altă funcție my_register_styles și/sau my_enqueue_styles și să schimbi toate stilurile (dacă este necesar, desigur) fără a fi nevoie să dezînregistrezi/elimini stilurile unul câte unul.


1 Iată încă o diferență între scripturi și stiluri: wp_enqueue_script poate fi folosit în corpul unei pagini (utilizare tipică este într-un shortcode) și scriptul va fi pus în subsol.

25 nov. 2013 13:31:25
Comentarii

Excelent G.M., ai analizat problema într-un mod atât de holistic. Felicitări pentru efortul depus. :)

Mayeenul Islam Mayeenul Islam
25 nov. 2013 13:38:36

Mulțumesc @MayeenulIslam, am început să răspund înainte ca toscho să marcheze întrebarea ca duplicat. Mă bucur că ți-a fost util, așa că probabil va fi util și pentru alții :)

gmazzap gmazzap
25 nov. 2013 13:48:29

@gmazzap Incredibil de util, tocmai am căutat wp_register_style vs wp_enqueue_style și răspunsul tău m-a ajutat să înțeleg complet problema.

lowtechsun lowtechsun
15 nov. 2016 20:13:41

Răspuns excelent, mulțumesc.

EmSixTeen EmSixTeen
2 dec. 2020 20:41:50