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

时间:2016-07-25 作者:Edouard Kombo

我正在创建一个插件,我想得到其他插件使用的所有脚本和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\' );

5 个回复
最合适的回答,由SO网友:Andy Macaulay-Brook 整理而成

do_action 不像那样工作。当你打电话的时候do_action(\'crunchify_print_scripts_styles\') WP查看其注册操作列表,并筛选任何附加到名为crunchify_print_scripts_styles 然后运行这些函数。

您可能想删除此项:

add_action( \'wp_enqueue_scripts\', \'crunchify_print_scripts_styles\');
。。。因为您无法获得函数的返回结果。

此外,当您使用这个特定的钩子时,您不能保证其他函数在生成列表后不会将更多的脚本或样式排入队列。为了方便起见,可以使用一个钩子,在所有脚本和样式都排队后激发,例如wp\\u 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\\u enqueue\\u脚本的任何挂钩上,如上文所述的wp\\u 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

}

SO网友:cybmeta

你可以使用wp_print_scriptswp_print_styles 对的操作timely and properly 访问排队的脚本和样式,因为这些操作是脚本和样式包含在文档中之前的最后一个事件,因此是最后一个修改$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 );
} );

SO网友:Stoian Delev

我的解决方案是:

在db中创建一个选项字段,激活会话并保护它们,我使用的功能

我从用户cybmeta的两个函数开始:只需为结果添加一个句柄。

function theme_list_scripts() {

    global $wp_scripts;
    global $enqueued_scripts;
    $enqueued_scripts = array();
    foreach( $wp_scripts->queue as $handle ) {
        $enqueued_scripts[] = $handle." | ".$wp_scripts->registered[$handle]->src;
    }
    return $enqueued_scripts;


}

function theme_list_styles() {

    global $wp_styles;
    global $enqueued_styles;
    $enqueued_styles = array();
    foreach( $wp_styles->queue as $handle ) {
        $enqueued_styles[] = $handle." | ".$wp_styles->registered[$handle]->src;
    }
    return $enqueued_styles;

}

add_action( \'wp_print_scripts\', \'wpcustom_inspect_scripts_and_styles\' );

function wpcustom_inspect_scripts_and_styles(){

    $loadet_list = array();

    $loadet_list["style"] = implode( " ; ",theme_list_styles() );

    $loadet_list["script"] = implode( " ; ",theme_list_scripts() );

    $_SESSION["front-end-list"] = implode("{}",$loadet_list);  


}

function front_loadet_files_list(){

    update_option( \'front_incl_list\', $_SESSION["front-end-list"] );

} 
在头文件中,在头标记之前的wp\\u head()之后调用:

front_loadet_files_list(); 
在要显示的文件模板的管理端:

从db中的选项字段获取数据

$loadet_list = prep_front_list("front-end-list");
调用它进行显示

display_front_list($loadet_list["styles"]);

display_front_list($loadet_list["scripts"]);
结果result view

SO网友:theuberdog

如果你真的想得到all 样式,您可以使用新的“script\\u loader\\u标记”(自版本4.1起)。

“wp\\u print\\u脚本”是:

由管理员标头调用。php和“wp\\u head”挂钩。

i、 e它不会在页脚中显示脚本。

References:

Add Defer & Async Attributes to WordPress Scripts

wp_print_scripts

SO网友:Geza Gog

要获取注册的脚本,需要函数wp\\u scripts(),要获取所有排队的样式,可以使用函数wp\\u styles()。添加适当的优先级也是确保在所有脚本注册后列出它们的一个重要方面

类似这样:

<?php

/*
Plugin name: My Plugin to list scripts and styles
*/


add_action( \'wp_enqueue_scripts\', \'my_plugin_print_styles\',  PHP_INT_MAX );

function my_plugin_print_styles(){
    $wp_scripts = wp_scripts();
    $wp_styles = wp_styles();
    var_dump($wp_scripts);
    var_dump($wp_styles);
}