如何获得所有排队的脚本和样式的列表?


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;然后在以后的函数中再次调用global来访问变量。
majick '16

感谢您的回答,但仍不能解决问题,var_dump($ crunchifyenqueued)的响应为“ NULL”。
爱德华·

那为什么不使用apply_filters呢?您可以轻松地从中获得返回值。
majick '16

我已经尝试过,无法将结果保存在变量中。
爱德华·康博

当然可以通过全局使用吗?
majick

Answers:


11

do_action不太像那样。当您调用do_action('crunchify_print_scripts_styles')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_enqueue_scripts之后运行的任何钩子上,例如我上面提到的wp_head:

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();您的插件!调整了适合的答案。
Andy Macaulay-Brook

它不起作用,脚本和样式均为空。似乎global wp_scripts global wp_styles完全是空的。但他们与工作do_action or apply_filters
爱德华·孔博

您在调用函数的时间晚于wp_enqueue_scripts我最初建议的操作吗?
Andy Macaulay-Brook

我扩大了答案,使之更清楚。
Andy Macaulay-Brook

7

您可以使用wp_print_scriptswp_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 );
} );

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.