Wie kann ich eine Liste aller eingereihten Skripte und Stile erhalten?

12

Ich erstelle ein Plugin und möchte eine Liste aller Skripte und CSS erhalten, die von anderen Plugins verwendet werden.

Das ist meine Funktion:

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

Ich möchte den zurückgegebenen Wert in einer Variablen erhalten.

Ich habe es versucht:

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

Und das ist mein Ergebnis:

NULL

Wenn ich echoin jeden schreibeforeach Schleife , erhalte ich die richtigen Ergebnisse, aber wie speichere ich diese Werte in einer Variablen?

[bearbeiten]

Mein Code in einem Plugin, das auch nicht funktioniert

/**
 *  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
quelle
1
do_actiongibt kein Ergebnis zurück, und außerdem hat die Aktion bereits stattgefunden, um wp_enqueue_scripts... einfacher nur ein globales zu erstellen, z. global $crunchifyenqueued; $crunchifyenqueued = $result;Rufen Sie dann in Ihrer späteren Funktion erneut das globale Element auf, um auf die Variable zuzugreifen.
Majick
Vielen Dank für Ihre Antwort, aber das Problem konnte nicht gelöst werden. Die Antwort für var_dump ($ crunchifyenqueued) lautet "NULL".
Edouard Kombo
also warum dann nicht nutzen apply_filters? Sie können leicht den Rückgabewert daraus erhalten.
Majick
Ich habe es bereits versucht, ich kann das Ergebnis nicht in einer Variablen speichern.
Edouard Kombo
Natürlich können Sie mit einem globalen?
Majick

Antworten:

11

do_actionfunktioniert so nicht ganz Wenn Sie do_action('crunchify_print_scripts_styles')WP aufrufen, wird die Liste der registrierten Aktionen und Filter für alle an einen aufgerufenen Hook angehängten Aktionen angezeigt. crunchify_print_scripts_stylesAnschließend werden diese Funktionen ausgeführt.

Und Sie möchten dies wahrscheinlich entfernen:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

... weil Sie das Rückgabeergebnis Ihrer Funktion nicht erhalten können.

Auch wenn Sie diesen speziellen Hook verwenden, können Sie nicht garantieren, dass andere Funktionen keine weiteren Skripte oder Stile in die Warteschlange stellen, nachdem Sie Ihre Liste erstellt haben. Verwenden Sie einen Hook, der ausgelöst wird, nachdem alle Skripte und Stile in die Warteschlange gestellt wurden, z. B. wp_head, oder rufen Sie Ihre Funktion einfach in Ihrem Thema auf, wenn Sie das Ergebnis anzeigen möchten.

Es sollte funktionieren, wenn Sie Ihren Code so überarbeiten ...

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

Dann innerhalb Ihres Themas:

print_r( crunchify_print_scripts_styles() );

... zeigt Ihnen die Ergebnisse für das Debuggen, oder natürlich ...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... gibt Ihnen die Liste zum Manipulieren.

Wenn Sie es im Design aufrufen, stellen Sie sicher, dass Sie es aufrufen, nachdem alle Skripte und Stile in die Warteschlange gestellt wurden.

Um es von Ihrem Plugin aus aufzurufen, hängen Sie es an jeden Hook an, der später als wp_enqueue_scripts ausgeführt wird, wie wp_head, wie oben erwähnt:

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
quelle
Danke @Andy, aber was ich tun möchte, ist, diese Werte in ein Plugin zu bekommen. Mein Plugin gibt diese Werte im json-Format zurück.
Edouard Kombo
Dann stecke es $all_the_scripts_and_styles = crunchify_print_scripts_styles();in dein Plugin! Die Antwort wurde angepasst.
Andy Macaulay-Brook
Es funktioniert nicht, sowohl Skripte als auch Stile sind leer. Es scheint global wp_scripts global wp_stylesvöllig leer zu sein. Aber sie arbeiten mit einemdo_action or apply_filters
Edouard Kombo
Rufen Sie Ihre Funktion später als wp_enqueue_scriptsursprünglich empfohlen auf?
Andy Macaulay-Brook
Ich habe die Antwort erweitert, um dies klarer zu machen.
Andy Macaulay-Brook
7

Sie könnten nutzen wp_print_scriptsund wp_print_stylesMaßnahmen rechtzeitig und richtig Zugriff auf die Warteschlange eingereiht Skripte und Stile, wie diese Aktionen die letzten Ereignisse vor Skripts und Stile werden in dem Dokument und aus diesem Grund enthalten, die letzte Veranstaltung , bei der Änderungen an $wp_stylesoder $wp_scriptsAuswirkungen auf Arten haben könnte und Skripte im Dokument enthalten.

Also, sie sind die Veranstaltungen , bei denen Sie mehr vertrauen können , dass $wp_stylesund $wp_scriptsdie Skripte enthalten und Stile effektiv in das Dokument aufgenommen.

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

Wenn Sie $enqueued_scriptsadn deklarieren$enqueued_styles als globale Variablen (oder einen anderen gültigen Bereich, der beispielsweise in der Eigenschaft einer Methode gespeichert werden kann), können Sie in einer späteren Aktion auf die Liste der Skripte und Stile zugreifen.

Zum Beispiel (nur ein kurzes Beispiel):

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
quelle
0

Wenn Sie wirklich eine Liste aller Stile erhalten möchten , können Sie den neuen Filter 'script_loader_tag' (seit Version 4.1) verwenden.

Das "wp_print_scripts" ist:

Wird von admin-header.php und dem Hook 'wp_head' aufgerufen.

dh es werden keine Skripte in der Fußzeile angezeigt.

Verweise:

Hinzufügen von Defer & Async-Attributen zu WordPress-Skripten

wp_print_scripts

theuberdog
quelle
Hast du vielleicht ein Beispiel, wie man das benutzt?
Lonix