it-swarm.com.de

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

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 echo in jede foreach-Schleife schreibe, 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' );
9
Edouard Kombo

do_action funktioniert so nicht ganz. Wenn Sie do_action('crunchify_print_scripts_styles') WP aufrufen, wird die Liste der registrierten Aktionen und Filter für alle Aktionen angezeigt, die an einen Hook mit dem Namen crunchify_print_scripts_styles angehängt sind. Anschließ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 einreihen nach Sie haben Ihre Liste generiert. 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 zB 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

}
10

Sie können wp_print_scripts und wp_print_styles Aktionen verwenden, um rechtzeitig und ordnungsgemäß auf in die Warteschlange eingereihte Skripte und Stile zuzugreifen, da diese Aktionen die letzten Ereignisse sind, bevor Skripte und Stile in das Dokument aufgenommen werden. Aus diesem Grund kann das letzte Ereignis, bei dem Änderungen an $wp_styles oder $wp_scripts vorgenommen wurden, Auswirkungen auf Stile und Skripte haben, die im Dokument enthalten sind.

Sie sind also die Ereignisse, bei denen Sie sicherer sein können, dass $wp_styles und $wp_scripts die Skripte und Stile enthalten, die effektiv im Dokument enthalten sind.

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_scripts und $enqueued_styles als globale Variablen deklarieren (oder einen anderen gültigen Bereich, den Sie beispielsweise in der Eigenschaft einer Methode speichern können), 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 );
} );
5
cybmeta

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

Das "wp_print_scripts" ist:

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

es werden keine Skripte in der Fußzeile angezeigt.

Referenzen:

Hinzufügen von verzögerten und asynchronen Attributen zu WordPress-Skripten

wp_print_scripts

0
theuberdog