¿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.