Come posso ottenere un elenco di tutti gli script e gli stili accodati?


12

Sto creando un plug-in e voglio ottenere l'elenco di tutti gli script e CSS utilizzati da altri plug-in.

Questa è la mia funzione:

function crunchify_print_scripts_styles() {    
    $result = [];
    $result['scripts'] = [];
    $result['styles'] = [];

    // Print all loaded Scripts
    global $wp_scripts;
    foreach( $wp_scripts->queue as $script ) :
       $result['scripts'][] =  $wp_scripts->registered[$script]->src . ";";
    endforeach;

    // Print all loaded Styles (CSS)
    global $wp_styles;
    foreach( $wp_styles->queue as $style ) :
       $result['styles'][] =  $wp_styles->registered[$style]->src . ";";
    endforeach;

    return $result;
}
add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

Voglio ottenere il valore restituito all'interno di una variabile.

Ho provato questo:

$toto = do_action( 'crunchify_print_scripts_styles' );
var_dump( $toto );

E questo è il mio risultato:

NULL

Se scrivo echoall'interno di ogni foreachciclo, ottengo i risultati corretti, ma come memorizzare questi valori all'interno di una variabile?

[modificare]

Il mio codice all'interno di un pluginm che non funziona troppo

/**
 *  Get all scripts and styles from Wordpress
 */
function print_scripts_styles() {

    $result = [];
    $result['scripts'] = [];
    $result['styles'] = [];

    // Print all loaded Scripts
    global $wp_scripts;
    foreach( $wp_scripts->queue as $script ) :
        $result['scripts'][] =  $wp_scripts->registered[$script]->src . ";";
    endforeach;

    // Print all loaded Styles (CSS)
    global $wp_styles;
    foreach( $wp_styles->queue as $style ) :
        $result['styles'][] =  $wp_styles->registered[$style]->src . ";";
    endforeach;

    return $result;
}

add_action( 'wp_head', 'wp_rest_assets_init');

/**
 * Init JSON REST API Assets routes.
 *
 * @since 1.0.0
 */
function wp_rest_assets_init() {


    $all_the_scripts_and_styles = print_scripts_styles();

    if ( ! defined( 'JSON_API_VERSION' ) &&
         ! in_array( 'json-rest-api/plugin.php', get_option( 'active_plugins' ) ) ) {
             $class = new WP_REST_Assets();
             $class::$scriptsAndStyles = $all_the_scripts_and_styles;
             add_filter( 'rest_api_init', array( $class, 'register_routes' ) );
    } else {
        $class = new WP_JSON_Menus();
        add_filter( 'json_endpoints', array( $class, 'register_routes' ) );
    }
}


add_action( 'init', 'wp_rest_assets_init' );

1
do_actionnon restituisce un risultato e inoltre l'azione è già avvenuta in wp_enqueue_scripts... più semplice solo per creare un globale, ad es. global $crunchifyenqueued; $crunchifyenqueued = $result;quindi chiama nuovamente il globale nella tua funzione successiva per accedere alla variabile.
Majick,

Grazie per la risposta, ma non ha risolto il problema, la risposta per var_dump ($ crunchifyenqueued) è "NULL".
Edouard Kombo,

allora perché non usarlo apply_filters? puoi facilmente ottenere il valore di ritorno da quello.
Majick,

Ho già provato, non riesco a salvare il risultato all'interno di una variabile.
Edouard Kombo,

certo che puoi usando un globale?
Majick,

Risposte:


11

do_actionnon funziona così. Quando chiami do_action('crunchify_print_scripts_styles')WP guarda il suo elenco di azioni e filtri registrati per quelli che sono collegati a un hook chiamato crunchify_print_scripts_stylese quindi esegue quelle funzioni.

E probabilmente vorrai rimuovere questo:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

... perché non sei in grado di ottenere il risultato di ritorno della tua funzione.

Inoltre, quando usi questo hook particolare, non puoi garantire che altre funzioni non accodino più script o stili dopo aver generato la tua lista. Usa un hook che si attiva dopo che tutti gli script e gli stili sono stati accodati, come wp_head, per comodità, o meglio chiama la tua funzione all'interno del tuo tema quando vuoi visualizzare il risultato.

Rielaborare il codice in questo modo dovrebbe funzionare ...

function crunchify_print_scripts_styles() {

    $result = [];
    $result['scripts'] = [];
    $result['styles'] = [];

    // Print all loaded Scripts
    global $wp_scripts;
    foreach( $wp_scripts->queue as $script ) :
       $result['scripts'][] =  $wp_scripts->registered[$script]->src . ";";
    endforeach;

    // Print all loaded Styles (CSS)
    global $wp_styles;
    foreach( $wp_styles->queue as $style ) :
       $result['styles'][] =  $wp_styles->registered[$style]->src . ";";
    endforeach;

    return $result;
}

Quindi, all'interno del tuo tema:

print_r( crunchify_print_scripts_styles() );

... ti mostrerà i risultati per il debug, o ovviamente ...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... ti darà la lista da manipolare.

Chiamandolo nel tema, assicurati di chiamarlo dopo che tutti gli script e gli stili sono accodati.

Per chiamarlo dal tuo plugin, collegalo a qualsiasi hook che viene eseguito dopo wp_enqueue_scripts, come wp_head come ho detto sopra:

add_action( 'wp_head', 'wpse_233142_process_list');

function wpse_233142_process_list() {

    $all_the_scripts_and_styles = crunchify_print_scripts_styles();
    // process your array here

}

Grazie @Andy, ma quello che voglio fare è ottenere questi valori all'interno di un plugin. Il mio plugin restituirà questi valori in un formato json.
Edouard Kombo,

Quindi inserisci il $all_the_scripts_and_styles = crunchify_print_scripts_styles();tuo plugin! Modificato la risposta per soddisfare.
Andy Macaulay-Brook,

Non funziona, sia gli script che gli stili sono vuoti. Sembra che global wp_scripts global wp_stylessiano totalmente vuoti. Ma lavorano con undo_action or apply_filters
Edouard Kombo il

Stai chiamando la tua funzione più tardi wp_enqueue_scriptsdell'azione come avevo raccomandato inizialmente?
Andy Macaulay-Brook,

Ho ampliato la risposta per renderlo più chiaro.
Andy Macaulay-Brook,

7

È possibile utilizzare wp_print_scriptse wp_print_stylesazioni per accedere in modo tempestivo e corretto a script e stili accodati, poiché queste azioni sono gli ultimi eventi prima che script e stili siano inclusi nel documento e, di conseguenza, l'ultimo evento in cui le modifiche $wp_styleso $wp_scriptspotrebbero avere effetto sugli stili e script inclusi nel documento.

Quindi, sono gli eventi in cui puoi essere più sicuro di ciò $wp_stylese $wp_scriptscontengono gli script e gli stili effettivamente inclusi nel documento.

add_action( 'wp_print_scripts', 'cyb_list_scripts' );
function cyb_list_scripts() {
    global $wp_scripts;
    $enqueued_scripts = array();
    foreach( $wp_scripts->queue as $handle ) {
        $enqueued_scripts[] = $wp_scripts->registered[$handle]->src;
    }
}
add_action( 'wp_print_styles', 'cyb_list_styles' );
function cyb_list_styles() {
    global $wp_styles;
    $enqueued_styles = array();
    foreach( $wp_styles->queue as $handle ) {
        $enqueued_styles[] = $wp_styles->registered[$handle]->src;
    }
}

Se si dichiara $enqueued_scriptsadn $enqueued_stylescome variabili globali (o qualsiasi altro ambito valido, ad esempio è possibile memorizzarlo nella proprietà di un metodo), è possibile accedere all'elenco di script e stili in un'azione successiva.

Ad esempio (solo un breve esempio):

global $enqueued_scripts;
global $enqueued_styles;

add_action( 'wp_print_scripts', 'cyb_list_scripts' );
function cyb_list_scripts() {
    global $wp_scripts;
    global $enqueued_scripts;
    $enqueued_scripts = array();
    foreach( $wp_scripts->queue as $handle ) {
        $enqueued_scripts[] = $wp_scripts->registered[$handle]->src;
    }
}
add_action( 'wp_print_styles', 'cyb_list_styles' );
function cyb_list_styles() {
    global $wp_styles;
    global $enqueued_styles;
    $enqueued_styles = array();
    foreach( $wp_styles->queue as $handle ) {
        $enqueued_styles[] = $wp_styles->registered[$handle]->src;
    }
}

add_action( 'wp_head', function() {
    global $enqueued_scripts;
    var_dump( $enqueued_scripts );
    global $enqueued_styles;
    var_dump( $enqueued_styles );
} );

0

Se vuoi veramente ottenere un elenco di tutti gli stili, puoi usare il nuovo filtro 'script_loader_tag' (Dalla versione 4.1).

"Wp_print_scripts" è:

Chiamato da admin-header.php e hook 'wp_head'.

cioè non mostra gli script nel piè di pagina.

Riferimenti:

Aggiungi attributi di differimento e asincrono agli script di WordPress

wp_print_scripts


Hai forse un esempio su come usare questo?
Lonix

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.