エンキューされたすべてのスクリプトとスタイルのリストを取得するにはどうすればよいですか?


12

プラグインを作成していますが、他のプラグインで使用されるすべてのスクリプトとCSSのリストを取得したいです。

これは私の機能です:

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

変数内の戻り値を取得したい。

私はこれを試しました:

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

そして、これは私の結果です:

NULL

echoすべてのforeachループ内で記述した場合、正しい結果が得られますが、これらの値を変数内に格納する方法はありますか?

[編集]

プラグイン内の私のコードも動作していません

/**
 *  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_action結果を返さず、さらに、アクションはすでに実行されていwp_enqueue_scriptsます...グローバルを作成するだけで簡単です。global $crunchifyenqueued; $crunchifyenqueued = $result;その後、変数にアクセスするために、後の関数で再度グローバルを呼び出します。
majick

回答いただきありがとうございますが、問題は解決しませんでした。var_dump($ crunchifyenqueued)の応答は「NULL」です。
エドゥアールコンボ

では、なぜ使用しないのapply_filtersですか?それから戻り値を簡単に取得できます。
majick

すでに試しましたが、変数内に結果を保存できません。
エドゥアールコンボ

もちろん、グローバルを使用してできますか?
majick

回答:


11

do_actionそのようには動作しません。do_action('crunchify_print_scripts_styles')WP を呼び出すと、WPは登録されたアクションのリストを調べ、呼び出されたフックにアタッチされているものをフィルターし、crunchify_print_scripts_stylesそれらの関数を実行します。

そして、おそらくこれを削除したいでしょう:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

...関数の戻り結果を取得できないためです。

また、この特定のフックを使用する場合、リストを生成した、他の関数がそれ以上スクリプトまたはスタイルをキューに登録しないことを保証できません。wp_headなど、すべてのスクリプトとスタイルがキューに入れられた後に起動するフックを使用します。これは、結果を表示するときにテーマ内で関数を呼び出すだけです。

このようにコードを修正すると動作するはずです...

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

次に、テーマ内で:

print_r( crunchify_print_scripts_styles() );

...デバッグの結果が表示されます。もちろん...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

...は、操作するリストを提供します。

テーマで呼び出すと、すべてのスクリプトとスタイルがキューに入れられた後に呼び出すようになります。

プラグインから呼び出すには、前述のwp_headのように、wp_enqueue_scriptsよりも後で実行されるフックに添付します。

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に感謝しますが、私がしたいのは、これらの値をプラグイン内で取得することです。プラグインはこれらの値をJSON形式で返します。
エドゥアールコンボ

次に$all_the_scripts_and_styles = crunchify_print_scripts_styles();、プラグインの中に入れてください!答えを合わせて微調整しました。
アンディマコーレイブルック

動作しません。スクリプトとスタイルの両方が空です。global wp_scripts global wp_styles空っぽのようです。しかし、彼らはdo_action or apply_filters
エドゥアールコンボ

wp_enqueue_scripts最初に推奨したアクションよりも後で関数を呼び出していますか?
アンディマコーレイブルック

それを明確にするために答えを拡大しました。
アンディマコーレイブルック

7

あなたは使用することができますwp_print_scriptsし、wp_print_stylesアクションにタイムリーかつ適切に、そのため、上の修正最後のイベント待ち行列に入れられたスクリプトやスタイルへのアクセス、スクリプトとスタイルは、文書に含まれている前に、これらのアクションは、最後のイベントであるとし、$wp_stylesまたは$wp_scriptsスタイルに影響を与える可能性をドキュメントに含まれるスクリプト。

だから、彼らはあなたがいることを、より自信を持つことができるイベントです$wp_stylesし、$wp_scripts効果的に文書に含まれたスクリプトとスタイルが含まれています。

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

$enqueued_scriptsadn $enqueued_stylesをグローバル変数(またはメソッドのプロパティに保存するなど、他の有効なスコープ)として宣言すると、後のアクションでスクリプトとスタイルのリストにアクセスできます。

例(簡単な例):

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

0

すべてのスタイルのリストを本当に取得したい場合は、新しい「script_loader_tag」フィルターを使用できます(バージョン4.1以降)。

「wp_print_scripts」は次のとおりです。

admin-header.phpおよび 'wp_head'フックによって呼び出されます。

つまり、フッターにスクリプトを表示しません。

参照:

WordPressスクリプトに遅延属性と非同期属性を追加する

wp_print_scripts


これを使用する方法の例はありますか?
lonix

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.