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

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

}

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

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


¿Quizás tenga un ejemplo de cómo usar esto?
— Lonix

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.