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

12

Estoy creando un complemento y quiero obtener la lista de todos los scripts y CSS utilizados por otros complementos.

Esta es mi función:

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

Quiero obtener el valor devuelto dentro de una variable.

Intenté esto:

$toto = do_action( 'crunchify_print_scripts_styles' );
var_dump( $toto );

Y este es mi resultado:

NULL

Si escribo echodentro de cada foreachciclo, obtengo los resultados correctos, pero ¿cómo almacenar estos valores dentro de una variable?

[editar]

Mi código dentro de un plugin que tampoco funciona

/**
 *  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' );
Edouard Kombo
fuente
1
do_actionno devuelve un resultado, y además, la acción ya ha tenido lugar en wp_enqueue_scripts... más fácil simplemente para crear un global, por ejemplo. global $crunchifyenqueued; $crunchifyenqueued = $result;luego vuelva a llamar al global en su función posterior para acceder a la variable.
majick
Gracias por su respuesta, pero no resolvió el problema, la respuesta para var_dump ($ crunchifyenqueued) es "NULL".
Edouard Kombo
apply_filtersEntonces, ¿ por qué no usar entonces? puede obtener fácilmente el valor de retorno de eso.
majick
Ya lo intenté, no puedo guardar el resultado dentro de una variable.
Edouard Kombo
¿por supuesto que puedes usando un global?
majick

Respuestas:

11

do_actionno funciona así Cuando llama, do_action('crunchify_print_scripts_styles')WP mira su lista de acciones registradas y filtros para cualquiera que esté conectado a un enlace llamado crunchify_print_scripts_stylesy luego ejecuta esas funciones.

Y probablemente quieras eliminar esto:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

... porque no puede obtener el resultado de retorno de su función.

Además, cuando utiliza este enlace particular, no puede garantizar que otras funciones no pongan en cola más scripts o estilos después de haber generado su lista. Use un gancho que se active después de que todos los scripts y estilos se hayan puesto en cola, como wp_head, por conveniencia, o mejor aún, simplemente llame a su función dentro de su tema cuando desee mostrar el resultado.

Volver a trabajar su código así debería funcionar ...

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;
}

Luego dentro de su tema:

print_r( crunchify_print_scripts_styles() );

... le mostrará los resultados para la depuración, o por supuesto ...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... te dará la lista para manipular.

Al llamarlo en el tema, asegúrese de llamarlo después de que todos los scripts y estilos estén en cola.

Para llamarlo desde su complemento, conéctelo a cualquier enlace que se ejecute después de wp_enqueue_scripts, como wp_head como mencioné anteriormente:

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 Macaulay-Brook
fuente
Gracias @Andy, pero lo que quiero hacer es obtener estos valores dentro de un complemento. Mi complemento devolverá estos valores en formato json.
Edouard Kombo
¡Luego ponlo $all_the_scripts_and_styles = crunchify_print_scripts_styles();dentro de tu plugin! Ajustó la respuesta a su gusto.
Andy Macaulay-Brook
No funciona, tanto los scripts como los estilos están vacíos. Parece que global wp_scripts global wp_stylesestán totalmente vacías. Pero trabajan con undo_action or apply_filters
Edouard Kombo
¿Está llamando a su función más tarde que la wp_enqueue_scriptsacción como recomendé originalmente?
Andy Macaulay-Brook
He ampliado la respuesta para aclarar eso.
Andy Macaulay-Brook
7

Puede usar wp_print_scriptsy wp_print_stylesacciones para acceder de manera oportuna y adecuada a los scripts y estilos en cola, ya que estas acciones son los últimos eventos antes de que los scripts y los estilos se incluyan en el documento y, por eso, el último evento donde las modificaciones $wp_styleso $wp_scriptspodrían tener efecto en los estilos y guiones incluidos en el documento.

Por lo tanto, son los eventos en los que puede estar más seguro $wp_stylesy $wp_scriptscontienen los scripts y estilos efectivamente incluidos 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 declara $enqueued_scriptsadn $enqueued_stylescomo variables globales (o cualquier otro ámbito válido, por ejemplo, podría almacenarlo en la propiedad de un método), podría acceder a la lista de secuencias de comandos 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 );
} );
cybmeta
fuente
0

Si realmente desea obtener una lista de todos los estilos, puede usar el nuevo filtro 'script_loader_tag' (desde la versión 4.1).

El "wp_print_scripts" es:

Llamado por admin-header.php y 'wp_head' hook.

es decir, no muestra scripts en el pie de página.

Referencias

Agregue atributos de aplazamiento y asíncrono a los scripts de WordPress

wp_print_scripts

theuberdog
fuente
¿Quizás tenga un ejemplo de cómo usar esto?
Lonix
1
Hola :) Quizás este artículo pueda ayudar a que su sitio sea más rápido con Async y JavaScript diferido: Presentación de script_loader_tag
theuberdog