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

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

}

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.