¿Cómo puedo obtener una lista de todos los scripts y estilos encolados?
Estoy creando un plugin y quiero obtener la lista de todos los scripts y CSS utilizados por otros plugins.
Esta es mi función:
function crunchify_print_scripts_styles() {
$result = [];
$result['scripts'] = [];
$result['styles'] = [];
// Imprimir todos los Scripts cargados
global $wp_scripts;
foreach( $wp_scripts->queue as $script ) :
$result['scripts'][] = $wp_scripts->registered[$script]->src . ";";
endforeach;
// Imprimir todos los Estilos cargados (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');
Quiero obtener el valor retornado dentro de una variable.
Intenté esto:
$toto = do_action( 'crunchify_print_scripts_styles' );
var_dump( $toto );
Y este es mi resultado:
NULL
Si escribo echo
dentro de cada bucle foreach
, obtengo los resultados correctos, pero ¿cómo almacenar estos valores dentro de una variable?
[editar]
Mi código dentro de un plugin, que tampoco está funcionando
/**
* Obtener todos los scripts y estilos de WordPress
*/
function print_scripts_styles() {
$result = [];
$result['scripts'] = [];
$result['styles'] = [];
// Imprimir todos los Scripts cargados
global $wp_scripts;
foreach( $wp_scripts->queue as $script ) :
$result['scripts'][] = $wp_scripts->registered[$script]->src . ";";
endforeach;
// Imprimir todos los Estilos cargados (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');
/**
* Inicializar rutas de JSON REST API Assets.
*
* @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' );

do_action
no funciona exactamente de esa manera. Cuando llamas a do_action('crunchify_print_scripts_styles')
, WordPress revisa su lista de acciones y filtros registrados para cualquier función asociada al hook llamado crunchify_print_scripts_styles
y luego ejecuta esas funciones.
Probablemente quieras eliminar esto:
add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');
... porque no puedes obtener el resultado devuelto por tu función.
Además, cuando usas este hook en particular, no puedes garantizar que otras funciones no añadan más scripts o estilos después de que hayas generado tu lista. Usa un hook que se ejecute después de que todos los scripts y estilos hayan sido añadidos, como wp_head por conveniencia, o mejor aún, simplemente llama a tu función directamente en tu tema cuando quieras mostrar el resultado.
Reestructurar tu código así debería funcionar...
function crunchify_print_scripts_styles() {
$result = [];
$result['scripts'] = [];
$result['styles'] = [];
// Mostrar todos los Scripts cargados
global $wp_scripts;
foreach( $wp_scripts->queue as $script ) :
$result['scripts'][] = $wp_scripts->registered[$script]->src . ";";
endforeach;
// Mostrar todos los Estilos (CSS) cargados
global $wp_styles;
foreach( $wp_styles->queue as $style ) :
$result['styles'][] = $wp_styles->registered[$style]->src . ";";
endforeach;
return $result;
}
Luego, dentro de tu tema:
print_r( crunchify_print_scripts_styles() );
... te mostrará los resultados para depuración, o por supuesto...
$all_the_scripts_and_styles = crunchify_print_scripts_styles();
... te dará la lista para manipular.
Llamarla en el tema asegura que se ejecute después de que todos los scripts y estilos hayan sido añadidos.
Para llamarla desde tu plugin, asóciala a cualquier hook que se ejecute después de wp_enqueue_scripts, como wp_head que mencioné anteriormente:
add_action( 'wp_head', 'wpse_233142_process_list');
function wpse_233142_process_list() {
$all_the_scripts_and_styles = crunchify_print_scripts_styles();
// procesa tu array aquí
}

Gracias @Andy, pero lo que quiero hacer es obtener estos valores dentro de un plugin. Mi plugin devolverá estos valores en formato JSON.

¡Entonces coloca $all_the_scripts_and_styles = crunchify_print_scripts_styles();
dentro de tu plugin! Modifiqué la respuesta para que se ajuste.

No funciona, tanto los scripts como los estilos están vacíos. Parece que global wp_scripts
global wp_styles
están completamente vacíos. Pero funcionan con un do_action o apply_filters

¿Estás llamando a tu función después de la acción wp_enqueue_scripts
como recomendé originalmente?

¡¡¡¡¡¡¡¡WOOOOOW!!!!!! Muchas gracias, ¡está funcionando PERFECTO! ¿Cómo puedo implementar esta nueva función wpse_233142_process_list
dentro de mi plugin? ¿Necesita tener el mismo nombre?

Renómbralo como quieras, siempre y cuando también lo renombres en la llamada al filtro. Y siéntete libre de aceptar la respuesta ;-)

Ok, lo siento, pero esto funciona bien dentro de un tema, pero no dentro de un plugin. Estoy buscando la razón, una vez que la encuentre compartiré mi resultado.

Si todo tu código se ejecuta mediante hooks, realmente no debería haber ninguna diferencia.

Actualicé mi publicación inicial con el código principal de mi plugin, por si quieres echarle un vistazo...

Continuemos esta discusión en el chat.

No puedo chatear ahora mismo. Pero parece que estás llamando a tu función en dos hooks diferentes y cuando la llamas en init
, ninguno de los scripts o estilos habrá sido encolado. No he revisado la REST API para nada, así que me pierdo ahí, pero necesitas llamar a mi código tan tarde como discutimos. También recuerda que ninguno de los scripts y estilos son necesarios o deseados en una llamada API, así que es posible que ninguno esté encolado en ese contexto y por lo tanto no tendrás ninguno que listar.

Podrías usar las acciones wp_print_scripts
y wp_print_styles
para acceder oportuna y correctamente a los scripts y estilos encolados, ya que estas acciones son los últimos eventos antes de que los scripts y estilos se incluyan en el documento y, por lo tanto, el último momento donde las modificaciones en $wp_styles
o $wp_scripts
pueden tener efecto sobre los estilos y scripts incluidos en el documento.
Así que, estos son los eventos donde puedes estar más seguro de que $wp_styles
y $wp_scripts
contienen los scripts y estilos que efectivamente se incluirán en el documento.
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;
}
}
Si declaras $enqueued_scripts
y $enqueued_styles
como variables globales (o cualquier otro ámbito válido, por ejemplo podrías almacenarlos en una propiedad de un método), podrás acceder a la lista de scripts y estilos en una acción posterior.
Por ejemplo (solo un ejemplo rápido):
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 );
} );

mi solución para esto es:
- crear un campo de opción en la base de datos
- activar sesiones y asegurarlas
Funciones que utilicé
Comencé con dos funciones del usuario cybmeta: solo agregué un manejador al resultado.
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"] );
}
en el archivo header llamar después de wp_head() antes de cerrar la etiqueta head:
front_loadet_files_list();
en el lado de administración, en el archivo template donde quieras mostrar:
obtener los datos del campo de opción en la base de datos
$loadet_list = prep_front_list("front-end-list");
llamarlo para mostrar
display_front_list($loadet_list["styles"]);
display_front_list($loadet_list["scripts"]);
el resultado

esto está arruinando la experiencia de Stackexchange. Aprende a escribir código de manera correcta usando el formato adecuado. Podrías estar causando muchos más problemas que soluciones al simplemente lanzar código sin ningún tipo de formato.

Si realmente deseas obtener una lista de todos los estilos, puedes usar el nuevo filtro 'script_loader_tag' (desde la versión 4.1).
El "wp_print_scripts" es:
Llamado por admin-header.php y el hook 'wp_head'.
Es decir, no muestra scripts en el pie de página.
Referencias:

Hola :) Quizás este artículo pueda ayudarte Haz tu sitio más rápido con JavaScript Async y Deferred: Introducción a script_loader_tag

Para obtener los scripts registrados necesitas la función wp_scripts() y para obtener todos los estilos encolados puedes usar la función wp_styles(). Establecer una prioridad adecuada también es un aspecto importante para asegurarse de listar los scripts después de que todos hayan sido registrados.
Algo como esto:
<?php
/*
Plugin name: Mi Plugin para listar scripts y estilos
*/
// Acción con prioridad máxima para asegurar que se ejecute después de todo
add_action( 'wp_enqueue_scripts', 'my_plugin_print_styles', PHP_INT_MAX );
function my_plugin_print_styles(){
// Obtener instancias de scripts y estilos
$wp_scripts = wp_scripts();
$wp_styles = wp_styles();
// Mostrar información de depuración
var_dump($wp_scripts);
var_dump($wp_styles);
}
