Я создаю плагин и хочу получить список всех скриптов и 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' );
wp-enqueue-script
wp-enqueue-style
scripts
css
Эдуард Комбо
источник
источник
do_action
не возвращает результат, и, кроме того, действие уже произошло приwp_enqueue_scripts
... проще просто создать глобал, например.global $crunchifyenqueued; $crunchifyenqueued = $result;
затем снова вызовите global в вашей более поздней функции для доступа к переменной.apply_filters
тогда? вы можете легко получить возвращаемое значение из этого.Ответы:
do_action
не совсем так работает. При вызовеdo_action('crunchify_print_scripts_styles')
WP просматривает список зарегистрированных действий и фильтров для всех, которые прикреплены к вызываемой ловушке,crunchify_print_scripts_styles
а затем запускает эти функции.И вы, вероятно, хотите удалить это:
... потому что вы не можете получить результат, возвращаемый вашей функцией.
Также, когда вы используете этот конкретный хук, вы не можете гарантировать, что другие функции не будут ставить в очередь больше скриптов или стилей после того, как вы сгенерировали свой список. Используйте ловушку, которая срабатывает после того, как все сценарии и стили были помещены в очередь, например, wp_head, для удобства, или, что еще лучше, просто вызовите свою функцию в своей теме, когда вы хотите отобразить результат.
Переработка вашего кода, как это должно работать ...
Тогда в вашей теме:
... покажет вам результаты для отладки, или, конечно, ...
... даст вам список для манипулирования.
Вызов этого в теме гарантирует, что вы вызовете его после того, как все сценарии и стили поставлены в очередь.
Чтобы вызвать его из вашего плагина, прикрепите его к любому хуку, который запускается позже, чем wp_enqueue_scripts, например, wp_head, как я упоминал выше:
источник
$all_the_scripts_and_styles = crunchify_print_scripts_styles();
в свой плагин! Подправили ответ на костюм.global wp_scripts
global wp_styles
они совершенно пусты. Но они работают сdo_action or apply_filters
wp_enqueue_scripts
действие, как я рекомендовал изначально?Вы можете использовать
wp_print_scripts
иwp_print_styles
действия для своевременного и правильного доступа к сценариям и стилям, поставленным в очередь, так как эти действия являются последними событиями перед включением скриптов и стилей в документ и, вследствие этого, последним событием, когда изменения$wp_styles
или$wp_scripts
могут повлиять на стили и сценарии, включенные в документ.Таким образом, они являются событиями, в которых вы можете быть более уверенными,
$wp_styles
и$wp_scripts
содержат сценарии и стили, эффективно включенные в документ.Если вы объявите
$enqueued_scripts
adn$enqueued_styles
как глобальные переменные (или любую другую допустимую область, например, вы можете сохранить ее в свойстве метода), вы сможете получить доступ к списку сценариев и стилей в последующем действии.Например (просто быстрый пример):
источник
Если вы действительно хотите получить список всех стилей, вы можете использовать новый фильтр 'script_loader_tag' (начиная с версии 4.1).
"Wp_print_scripts" это:
т.е. он не показывает скрипты в нижнем колонтитуле.
Ссылки:
Добавить атрибуты Defer & Async в сценарии WordPress
wp_print_scripts
источник