Come ottenere una lista di tutti gli script e gli stili accodati?

25 lug 2016, 17:44:50
Visualizzazioni: 41.9K
Voti: 23

Sto creando un plugin e voglio ottenere la lista di tutti gli script e CSS utilizzati da altri plugin.

Questa è la mia funzione:

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

    // Stampa tutti gli Script caricati 
    global $wp_scripts;
    foreach( $wp_scripts->queue as $script ) :
       $result['scripts'][] =  $wp_scripts->registered[$script]->src . ";";
    endforeach;

    // Stampa tutti gli Stili caricati (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 echo all'interno di ogni ciclo foreach, ottengo i risultati corretti, ma come posso memorizzare questi valori all'interno di una variabile?

[modifica]

Il mio codice all'interno di un plugin, che non funziona neanche questo

/**
 *  Ottieni tutti gli script e gli stili da WordPress
 */
function print_scripts_styles() {

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

    // Stampa tutti gli Script caricati
    global $wp_scripts;
    foreach( $wp_scripts->queue as $script ) :
        $result['scripts'][] =  $wp_scripts->registered[$script]->src . ";";
    endforeach;

    // Stampa tutti gli Stili caricati (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');

/**
 * Inizializza i percorsi JSON REST API Assets.
 *
 * @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' );
7
Commenti

do_action non restituisce un risultato e, inoltre, l'azione è già avvenuta in wp_enqueue_scripts... sarebbe più semplice creare una variabile globale, ad es. global $crunchifyenqueued; $crunchifyenqueued = $result; e poi richiamare la variabile globale nella tua funzione successiva per accedere al valore.

majick majick
25 lug 2016 17:54:23

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

Edouard Kombo Edouard Kombo
25 lug 2016 18:09:16

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

majick majick
25 lug 2016 18:57:21

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

Edouard Kombo Edouard Kombo
27 lug 2016 11:04:31

certo che puoi usando una globale?

majick majick
27 lug 2016 11:49:11

Non funziona neanche

Edouard Kombo Edouard Kombo
27 lug 2016 12:59:40

da dove diavolo viene endforeach; in codici del genere??

T.Todua T.Todua
7 apr 2020 14:32:24
Mostra i restanti 2 commenti
Tutte le risposte alla domanda 5
13
22

do_action non funziona esattamente in questo modo. Quando chiami do_action('crunchify_print_scripts_styles'), WordPress cerca nella sua lista di azioni e filtri registrati quelli associati a un hook chiamato crunchify_print_scripts_styles e poi 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 restituito dalla tua funzione.

Inoltre, quando usi questo hook specifico, non puoi garantire che altre funzioni non aggiungano altri script o stili dopo che hai generato la tua lista. Per comodità, usa un hook che viene attivato dopo che tutti gli script e gli stili sono stati accodati, come wp_head, o meglio ancora chiama semplicemente la tua funzione all'interno del tuo tema quando vuoi mostrare il risultato.

Rielaborando il tuo codice in questo modo dovrebbe funzionare...

function crunchify_print_scripts_styles() {

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

    // Stampa tutti gli Script caricati
    global $wp_scripts;
    foreach( $wp_scripts->queue as $script ) :
       $result['scripts'][] =  $wp_scripts->registered[$script]->src . ";";
    endforeach;

    // Stampa tutti gli Stili caricati (CSS)
    global $wp_styles;
    foreach( $wp_styles->queue as $style ) :
       $result['styles'][] =  $wp_styles->registered[$style]->src . ";";
    endforeach;

    return $result;
}

Poi all'interno del tuo tema:

print_r( crunchify_print_scripts_styles() );

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

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... ti darà la lista da manipolare.

Chiamarla nel tema assicura che venga chiamata dopo che tutti gli script e gli stili sono stati accodati.

Per chiamarla dal tuo plugin, associala a qualsiasi hook che viene eseguito dopo wp_enqueue_scripts, come wp_head che ho menzionato sopra:

add_action( 'wp_head', 'wpse_233142_process_list');

function wpse_233142_process_list() {

    $all_the_scripts_and_styles = crunchify_print_scripts_styles();
    // elabora il tuo array qui

}
25 lug 2016 17:57:57
Commenti

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

Edouard Kombo Edouard Kombo
25 lug 2016 18:03:37

Allora inserisci $all_the_scripts_and_styles = crunchify_print_scripts_styles(); nel tuo plugin! Ho modificato la risposta per adattarla.

Andy Macaulay-Brook Andy Macaulay-Brook
25 lug 2016 18:06:41

Non funziona, sia gli script che gli stili sono vuoti. Sembra che global wp_scripts global wp_styles siano completamente vuoti. Ma funzionano con un do_action o apply_filters

Edouard Kombo Edouard Kombo
25 lug 2016 18:15:58

Stai chiamando la tua funzione dopo l'azione wp_enqueue_scripts come ti ho consigliato originariamente?

Andy Macaulay-Brook Andy Macaulay-Brook
25 lug 2016 18:17:36

Ho ampliato la risposta per renderlo più chiaro.

Andy Macaulay-Brook Andy Macaulay-Brook
25 lug 2016 18:21:00

DIOOOO MIOOOO???? Grazie mille, funziona PERFETTAMENTE !!!!!!!! Come posso implementare questa nuova funzione wpse_233142_process_list nel mio plugin? Deve avere lo stesso nome?

Edouard Kombo Edouard Kombo
25 lug 2016 19:04:49

Rinominatelo come preferite, purché lo rinominiate anche nella chiamata del filtro. E sentitevi liberi di accettare la risposta ;-)

Andy Macaulay-Brook Andy Macaulay-Brook
25 lug 2016 21:56:31

Ok scusate, ma questo funziona bene all'interno di un tema, ma non all'interno di un plugin. Sto cercando il motivo, una volta trovato condividerò il risultato.

Edouard Kombo Edouard Kombo
27 lug 2016 12:34:34

Se tutto il vostro codice viene eseguito tramite hook non dovrebbe esserci alcuna differenza.

Andy Macaulay-Brook Andy Macaulay-Brook
27 lug 2016 12:37:29

Ho aggiornato il mio post iniziale con il codice principale del mio plugin, se vuoi darci un'occhiata...

Edouard Kombo Edouard Kombo
27 lug 2016 12:58:24

Continuiamo questa discussione nella chat.

Edouard Kombo Edouard Kombo
27 lug 2016 13:01:57

Non posso chattare adesso. Ma sembra che tu stia chiamando la tua funzione su due hook diversi e quando la chiami su init allora nessuno degli script o stili sarà stato accodato. Non ho esaminato l'API REST, quindi mi perdo lì, ma devi chiamare il mio codice il più tardi possibile come abbiamo discusso. Ricorda anche che nessuno degli script e stili è necessario o desiderato in una chiamata API, quindi è possibile che in quel contesto nessuno sia accodato e quindi non ne avrai nessuno da elencare.

Andy Macaulay-Brook Andy Macaulay-Brook
27 lug 2016 13:07:59

Sto cercando ora come far eseguire i miei hook per ultimi, perché non vedo altre soluzioni

Edouard Kombo Edouard Kombo
27 lug 2016 13:26:23
Mostra i restanti 8 commenti
0
17

Puoi utilizzare le azioni wp_print_scripts e wp_print_styles per accedere in modo tempestivo e corretto agli script e agli stili accodati, poiché queste azioni rappresentano gli ultimi eventi prima che gli script e gli stili vengano inclusi nel documento e, per questo motivo, sono gli ultimi eventi in cui le modifiche a $wp_styles o $wp_scripts possono avere effetto sugli stili e sugli script inclusi nel documento.

Quindi, sono gli eventi in cui puoi essere più sicuro che $wp_styles e $wp_scripts contengano 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 dichiari $enqueued_scripts e $enqueued_styles come variabili globali (o in qualsiasi altro ambito valido, ad esempio potresti memorizzarli in una proprietà di un metodo), puoi accedere alla lista degli script e degli stili in un'azione successiva.

Ad esempio (solo un rapido 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 );
} );
25 lug 2016 19:15:41
2

La mia soluzione per questo è:

  • creare un campo opzione nel database
  • attivare le sessioni e renderle sicure

Funzioni che ho utilizzato

Ho iniziato con due funzioni dell'utente cybmeta: ho solo aggiunto un handle al risultato.

function theme_list_scripts() {

    global $wp_scripts;
    global $enqueued_scripts;
    $enqueued_scripts = array();
    foreach( $wp_scripts->queue as $handle ) {
        $enqueued_scripts[] = $handle." | ".$wp_scripts->registered[$handle]->src;
    }
    return $enqueued_scripts;


}

function theme_list_styles() {

    global $wp_styles;
    global $enqueued_styles;
    $enqueued_styles = array();
    foreach( $wp_styles->queue as $handle ) {
        $enqueued_styles[] = $handle." | ".$wp_styles->registered[$handle]->src;
    }
    return $enqueued_styles;

}

add_action( 'wp_print_scripts', 'wpcustom_inspect_scripts_and_styles' );

function wpcustom_inspect_scripts_and_styles(){

    $loadet_list = array();

    $loadet_list["style"] = implode( " ; ",theme_list_styles() );

    $loadet_list["script"] = implode( " ; ",theme_list_scripts() );

    $_SESSION["front-end-list"] = implode("{}",$loadet_list);  


}

function front_loadet_files_list(){

    update_option( 'front_incl_list', $_SESSION["front-end-list"] );

} 

Nel file header chiamare dopo wp_head() e prima della chiusura del tag head:

front_loadet_files_list(); 

Nella parte admin, nel file template dove vuoi visualizzare:

recuperare i dati dal campo opzione nel database

$loadet_list = prep_front_list("front-end-list");

chiamarlo per visualizzare

display_front_list($loadet_list["styles"]);

display_front_list($loadet_list["scripts"]);

il risultatoVisualizzazione del risultato

9 apr 2020 13:51:18
Commenti

questo sta rovinando l'esperienza su Stackexchange. Impara a scrivere il codice usando la formattazione corretta. Potresti causare molti più problemi che offrire soluzioni limitandoti a buttare fuori codice completamente non formattato.

Altin Altin
13 set 2020 14:33:43

Sembra l'unica soluzione valida tra tutte le risposte. Anche se sarebbe meglio evitare di usare la variabile $_SESSION.

Serhiy Zaharchenko Serhiy Zaharchenko
24 dic 2021 11:00:21
2

Se desideri veramente ottenere un elenco di tutti gli stili, puoi utilizzare il nuovo filtro 'script_loader_tag' (a partire dalla versione 4.1).

Il "wp_print_scripts" è:

Richiamato da admin-header.php e dall'hook ‘wp_head’.

Ovvero, non mostra gli script nel footer.

Riferimenti:

Aggiungi Attributi Defer e Async agli Script WordPress

wp_print_scripts

18 gen 2019 11:26:22
Commenti

Hai per caso un esempio su come usare questo?

lonix lonix
15 gen 2020 12:01:00

Ciao :) Forse questo articolo può aiutarti Rendi il tuo sito più veloce con JavaScript Async e Deferred: Introduzione a script_loader_tag

theuberdog theuberdog
18 feb 2020 19:18:33
0

per ottenere gli script registrati hai bisogno della funzione wp_scripts() e per ottenere tutti gli stili accodati puoi usare la funzione wp_styles(). Assegnare una priorità adeguata è anche un aspetto importante per assicurarsi di elencare gli script dopo che tutti sono stati registrati

qualcosa come questo:

<?php

/*
Plugin name: My Plugin to list scripts and styles
*/


add_action( 'wp_enqueue_scripts', 'my_plugin_print_styles',  PHP_INT_MAX );

function my_plugin_print_styles(){
    $wp_scripts = wp_scripts();
    $wp_styles = wp_styles();
    var_dump($wp_scripts);
    var_dump($wp_styles);
}
30 set 2021 19:14:30