Як я можу отримати список усіх задіяних сценаріїв та стилів?


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 розглядає його список зареєстрованих дій та фільтрів для тих, які прикріплені до гака, який називається, 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.
Edouard Kombo

Тоді покладіть $all_the_scripts_and_styles = crunchify_print_scripts_styles();всередину свого плагіна! Налаштував відповідь на задоволення.
Енді Макола-Брук

Це не працює, і сценарії, і стилі порожні. Здається, global wp_scripts global wp_stylesвони абсолютно порожні. Але вони працюють зdo_action or apply_filters
Edouard Kombo

Ви викликаєте свою функцію пізніше 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":

Викликається адміністратором-header.php та гачком 'wp_head'.

тобто він не показує сценарії в нижньому колонтитулі.

Список літератури:

Додайте атрибути відстрочки та асинхронізації до сценаріїв WordPress

wp_print_scripts


Чи може у вас є приклад, як це використовувати?
lonix

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.