Perché wp_register_style() è importante quando uso già wp_enqueue_style()?

25 nov 2013, 08:29:18
Visualizzazioni: 30.3K
Voti: 24

Attualmente sto lavorando su un tema e ho fatto alcune inclusioni di stili e script. Quando ho incluso gli script, ho prima usato wp_register_script() e poi li ho accodati con wp_enqueue_script() - perché ho capito che questo è il modo corretto di accodare gli script. Ma nell'inclusione degli stili, ho usato solo wp_enqueue_style() con tutti i suoi parametri. Solo ora ho ricevuto una risposta da s_ha_dum che dice che l'utilizzo di wp_register_style() renderebbe il tema compatibile con i child theme - mi chiedo, senza wp_register_style() sto usando solo wp_enqueue_style() e il mio tema funziona bene con gli stili accodati. Li ho accodati così:

add_action( 'wp_enqueue_scripts', 'wpse20131025_styles' );

function wpse20131025_styles(){
    // Includi lo stile principale del sito
    wp_enqueue_style( 'site-styles', get_template_directory_uri() . '/style.css', '', '', 'screen' );
    // Includi gli stili del menu per dispositivi desktop
    wp_enqueue_style( 'menu-styles', get_template_directory_uri() . '/css/menu.css', '', '', 'screen and (min-device-width: 800px)' );
    // Includi gli stili del menu per dispositivi mobili
    wp_enqueue_style( 'mobile-menu-styles', get_template_directory_uri() . '/css/mobile-menu.css', '', '', 'screen and (max-device-width: 799px)' );
}

Dato che wp_enqueue_style() ha tutti i parametri presenti in wp_register_style() ($handle, $src, $deps, $ver, $media) perché dovrei ripeterli? O, qual è esattamente lo scopo di wp_register_style() rispetto a wp_enqueue_style()?

0
Tutte le risposte alla domanda 1
4
41

Innanzitutto diciamo che per queste funzioni ciò che vale per gli stili vale esattamente anche per gli script, ma ci sono alcune eccezioni al contrario spiegate nella risposta.

La differenza principale tra le funzioni wp_enqueue_* e le rispettive wp_register_* è che le prime aggiungono script/stili alla coda, mentre le seconde preparano script/stili per essere aggiunti.

Probabilmente lo sai già, ma c'è una seconda differenza; wp_register_* può essere utilizzato in ogni hook, anche in un hook iniziale come init, ma wp_enqueue_* dovrebbe essere usato sull'hook wp_enqueue_scripts (o admin_enqueue_scripts per il backend) 1.

Lo scenario tipico di utilizzo di entrambe le funzioni è quando vuoi registrare script/stili all'inizializzazione del tema, e poi caricarli condizionalmente in alcune pagine, ad esempio:

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

In questo modo il caricamento condizionale è più leggibile e meno verboso.

Inoltre, se vuoi caricare uno o più degli stili/script registrati anche nel backend, puoi usare l'handle registrato in una funzione agganciata a admin_enqueue_scripts senza dover passare di nuovo tutti i parametri.

Sicuramente questo è più utile per gli script, grazie a wp_localize_script che nello scenario precedente può essere chiamato una volta, dopo la registrazione dello script, e poi nel caricamento condizionale basta caricare lo script, anche se viene usato più volte: questo mantiene il codice più semplice e DRY.

Quando registri uno script/stile e subito dopo lo carichi, è solo un compito inutile, che in realtà può essere completamente evitato:

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

Non c'è alcun vantaggio nel caricare uno stile (o script) in questo modo, usa semplicemente wp_enqueue_style con tutti i parametri di wp_enqueue_style e il gioco è fatto.

La frase precedente è valida anche per quanto riguarda la compatibilità con i child theme. Per sovrascrivere uno stile nel child theme, quando il parent sta usando wp_register_style immediatamente seguito da wp_enqueue_style, devi deregistrare lo stile e registrarlo di nuovo con un altro URL. Se il parent usa solo wp_enqueue_style, nel child theme puoi usare wp_dequeue_style e caricare il nuovo stile, quindi nel child theme servono 2 righe di codice in entrambi i casi.

Tuttavia, ciò che è molto compatibile con i child theme è racchiudere le funzioni che caricano e/o registrano stili e script in un if ( ! function_exists(... in questo modo il child theme può sovrascrivere stili e script del parent theme tutto in un unico punto:

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

Ora nel child theme è possibile scrivere un'altra funzione my_register_styles e/o my_enqueue_styles e cambiare tutti gli stili (se necessario, ovviamente) senza dover deregistrare/decaricare gli stili uno per uno.


1 Ecco un'altra differenza tra script e stili: wp_enqueue_script può essere usato nel corpo di una pagina (l'uso tipico è in uno shortcode) e lo script verrà posizionato nel footer.

25 nov 2013 13:31:25
Commenti

Ottimo G.M., hai esaminato la questione in modo così olistico. Complimenti per il tuo impegno. :)

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

Grazie @MayeenulIslam, ho iniziato a rispondere prima che toscho segnasse la domanda come duplicata. Sono contento che ti sia stato utile, quindi probabilmente lo sarà anche per altri :)

gmazzap gmazzap
25 nov 2013 13:48:29

@gmazzap Incredibilmente utile, ho appena cercato wp_register_style vs wp_enqueue_style e la tua risposta mi ha aiutato a capire a fondo la questione.

lowtechsun lowtechsun
15 nov 2016 20:13:41

Ottima risposta, grazie.

EmSixTeen EmSixTeen
2 dic 2020 20:41:50