Как я могу получить список всех сценариев и стилей в очереди?

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 в вашей более поздней функции для доступа к переменной.
Маджик
Спасибо за ваш ответ, но это не решило проблему, ответ для var_dump ($ crunchifyenqueued) - "NULL".
Эдуард Комбо
так почему бы не использовать apply_filtersтогда? вы можете легко получить возвращаемое значение из этого.
Маджик
Я уже пробовал, я не могу сохранить результат внутри переменной.
Эдуард Комбо
конечно можно с помощью глобального?
Мэйджик

Ответы:

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();в свой плагин! Подправили ответ на костюм.
Энди Маколей-Брук
Это не работает, скрипты и стили пусты. Кажется, что 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 );
} );
cybmeta
источник
0

Если вы действительно хотите получить список всех стилей, вы можете использовать новый фильтр 'script_loader_tag' (начиная с версии 4.1).

"Wp_print_scripts" это:

Вызывается с помощью admin-header.php и хука 'wp_head'.

т.е. он не показывает скрипты в нижнем колонтитуле.

Ссылки:

Добавить атрибуты Defer & Async в сценарии WordPress

wp_print_scripts

theuberdog
источник
Может быть, у вас есть пример, как это использовать?
Ионикс