¿Cómo puedo obtener una lista de todos los scripts y estilos encolados?

25 jul 2016, 17:44:50
Vistas: 41.9K
Votos: 23

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' );
7
Comentarios

do_action no devuelve un resultado y, además, la acción ya ha ocurrido en wp_enqueue_scripts... sería más fácil simplemente crear una variable global, por ejemplo: global $crunchifyenqueued; $crunchifyenqueued = $result; y luego llamar nuevamente a la global en tu función posterior para acceder a la variable.

majick majick
25 jul 2016 17:54:23

Gracias por tu respuesta, pero no resolvió el problema, la respuesta para var_dump($crunchifyenqueued) es "NULL".

Edouard Kombo Edouard Kombo
25 jul 2016 18:09:16

Entonces, ¿por qué no usar apply_filters? Puedes obtener fácilmente el valor de retorno de eso.

majick majick
25 jul 2016 18:57:21

Ya lo intenté, no puedo guardar el resultado dentro de una variable.

Edouard Kombo Edouard Kombo
27 jul 2016 11:04:31

por supuesto que puedes usando una variable global?

majick majick
27 jul 2016 11:49:11

Tampoco funciona

Edouard Kombo Edouard Kombo
27 jul 2016 12:59:40

¿de dónde diablos viene endforeach; en códigos como estos??

T.Todua T.Todua
7 abr 2020 14:32:24
Mostrar los 2 comentarios restantes
Todas las respuestas a la pregunta 5
13
22

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í

}
25 jul 2016 17:57:57
Comentarios

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

Edouard Kombo Edouard Kombo
25 jul 2016 18:03:37

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

Andy Macaulay-Brook Andy Macaulay-Brook
25 jul 2016 18:06:41

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

Edouard Kombo Edouard Kombo
25 jul 2016 18:15:58

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

Andy Macaulay-Brook Andy Macaulay-Brook
25 jul 2016 18:17:36

He ampliado la respuesta para que quede más claro.

Andy Macaulay-Brook Andy Macaulay-Brook
25 jul 2016 18:21:00

¡¡¡¡¡¡¡¡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?

Edouard Kombo Edouard Kombo
25 jul 2016 19:04:49

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

Andy Macaulay-Brook Andy Macaulay-Brook
25 jul 2016 21:56:31

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.

Edouard Kombo Edouard Kombo
27 jul 2016 12:34:34

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

Andy Macaulay-Brook Andy Macaulay-Brook
27 jul 2016 12:37:29

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

Edouard Kombo Edouard Kombo
27 jul 2016 12:58:24

Continuemos esta discusión en el chat.

Edouard Kombo Edouard Kombo
27 jul 2016 13:01:57

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.

Andy Macaulay-Brook Andy Macaulay-Brook
27 jul 2016 13:07:59

Estoy buscando ahora cómo hacer que mis hooks se ejecuten al final, porque no veo ninguna otra solución

Edouard Kombo Edouard Kombo
27 jul 2016 13:26:23
Mostrar los 8 comentarios restantes
0
17

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 );
} );
25 jul 2016 19:15:41
2

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 resultadovista de resultados

9 abr 2020 13:51:18
Comentarios

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.

Altin Altin
13 sept 2020 14:33:43

Parece ser la única solución viable entre todas las respuestas. Aunque sería bueno eliminar el uso de la variable $_SESSION.

Serhiy Zaharchenko Serhiy Zaharchenko
24 dic 2021 11:00:21
2

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:

Agregar Atributos Defer & Async a Scripts de WordPress

wp_print_scripts

18 ene 2019 11:26:22
Comentarios

¿Tal vez tienes un ejemplo de cómo usar esto?

lonix lonix
15 ene 2020 12:01:00

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

theuberdog theuberdog
18 feb 2020 19:18:33
0

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);
}
30 sept 2021 19:14:30