Jak mogę uzyskać listę wszystkich kolejkowanych skryptów i stylów?

12

Tworzę wtyczkę i chcę uzyskać listę wszystkich skryptów i CSS używanych przez inne wtyczki.

To moja funkcja:

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

Chcę uzyskać zwróconą wartość w zmiennej.

Próbowałem tego:

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

A to mój wynik:

NULL

Jeśli piszę echow każdej foreachpętli, otrzymuję prawidłowe wyniki, ale jak przechowywać te wartości w zmiennej?

[edytować]

Mój kod wewnątrz wtyczki, która również nie działa

/**
 *  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' );
Edouard Kombo
źródło
1
do_actionnie zwraca wyniku, a poza tym akcja już się odbyła w wp_enqueue_scripts... łatwiej po prostu stworzyć globalny, np. global $crunchifyenqueued; $crunchifyenqueued = $result;następnie ponownie wywołaj globalny w późniejszej funkcji, aby uzyskać dostęp do zmiennej.
majick
Dzięki za odpowiedź, ale to nie rozwiązało problemu, odpowiedź dla var_dump ($ crunchifyenqueued) to „NULL”.
Edouard Kombo,
dlaczego więc nie użyć apply_filters? z tego można łatwo uzyskać wartość zwrotną.
majick
Próbowałem już, nie mogę zapisać wyniku w zmiennej.
Edouard Kombo
oczywiście możesz to zrobić za pomocą globalnego?
majick

Odpowiedzi:

11

do_actionnie całkiem tak działa. Po wywołaniu do_action('crunchify_print_scripts_styles')WP patrzy na listę zarejestrowanych akcji i filtrów dla tych, które są podłączone do wywoływanego haka, crunchify_print_scripts_stylesa następnie uruchamia te funkcje.

I prawdopodobnie chcesz to usunąć:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

... ponieważ nie możesz uzyskać wyniku zwracanego przez twoją funkcję.

Również podczas korzystania z tego konkretnego haka nie można zagwarantować, że inne funkcje nie będą kolejkować kolejnych skryptów ani stylów po wygenerowaniu listy. Użyj haka, który uruchamia się po kolejkowaniu wszystkich skryptów i stylów, takich jak wp_head, dla wygody, lub lepiej po prostu wywołaj swoją funkcję w motywie, gdy chcesz wyświetlić wynik.

Przeróbka kodu w ten sposób powinna działać ...

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

Następnie w swoim motywie:

print_r( crunchify_print_scripts_styles() );

... pokaże wyniki debugowania lub oczywiście ...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... da ci listę do manipulacji.

Wywołanie go w kompozycji gwarantuje, że będzie ono wywoływane po kolejkowaniu wszystkich skryptów i stylów.

Aby wywołać go ze swojej wtyczki, dołącz go do dowolnego haka, który działa później niż wp_enqueue_scripts, jak wp_head, jak wspomniałem powyżej:

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

}
Andy Macaulay-Brook
źródło
Dzięki @Andy, ale chcę zrobić te wartości w wtyczce. Moja wtyczka zwróci te wartości w formacie json.
Edouard Kombo,
Następnie włóż $all_the_scripts_and_styles = crunchify_print_scripts_styles();wtyczkę! Poprawiono odpowiedź, aby dopasować.
Andy Macaulay-Brook
To nie działa, zarówno skrypty, jak i style są puste. Wygląda na to, że global wp_scripts global wp_stylessą całkowicie puste. Ale pracują zdo_action or apply_filters
Edouard Kombo,
Czy wywołujesz swoją funkcję później niż wp_enqueue_scriptsakcja, jak pierwotnie zalecałem?
Andy Macaulay-Brook
Rozszerzyłem odpowiedź, aby to wyjaśnić.
Andy Macaulay-Brook
7

Możesz użyć wp_print_scriptsi wp_print_stylesakcji, aby na czas i odpowiednio uzyskać dostęp do kolejkowanych skryptów i stylów, ponieważ te akcje są ostatnimi zdarzeniami, zanim skrypty i style zostaną uwzględnione w dokumencie, a zatem ostatnie zdarzenie, w którym modyfikacje stylów $wp_styleslub $wp_scriptsmogą mieć wpływ na style oraz skrypty zawarte w dokumencie.

Tak, są zdarzenia, gdzie można być bardziej pewni, że $wp_stylesi $wp_scriptszawierać skrypty i style skutecznie zawarte w dokumencie.

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

Jeśli zadeklarujesz $enqueued_scriptsadn $enqueued_stylesjako zmienne globalne (lub inny prawidłowy zakres, na przykład możesz zapisać go we właściwości metody), możesz uzyskać dostęp do listy skryptów i stylów w późniejszym działaniu.

Na przykład (tylko szybki przykład):

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 );
} );
cybmeta
źródło
0

Jeśli naprawdę chcesz uzyskać listę wszystkich stylów, możesz użyć nowego filtru „script_loader_tag” (od wersji 4.1).

„Wp_print_scripts” to:

Wywoływane przez admin-header.php i hook „wp_head”.

tzn. nie pokazuje skryptów w stopce.

Bibliografia:

Dodaj atrybuty odroczenia i asynchronizacji do skryptów WordPress

wp_print_scripts

theuberdog
źródło
Czy masz przykład, jak tego użyć?
lonix