web-dev-qa-db-ja.com

エンキューされたすべてのスクリプトとスタイルのリストを取得する方法を教えてください。

私はプラグインを作成していて、他のプラグインで使用されているすべてのスクリプトと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' );
9
Edouard Kombo

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

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

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

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

また、この特定のフックを使用すると、他の関数がそれ以上スクリプトやスタイルをキューに入れないことを保証できませんafterあなたはリストを生成しました。 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

}
10

wp_print_scripts および wp_print_styles actionsを タイムリーかつ適切に アクセスすると、スクリプトおよびスタイルがドキュメントに含まれる前の最後のイベントになります。そのため、$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_scripts adn $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 );
} );
5
cybmeta

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

"wp_print_scripts"は次のとおりです。

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

つまり、フッターにスクリプトは表示されません。

参照:

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

wp_print_scripts

0
theuberdog