Como posso obter uma lista de todos os scripts e estilos de enfileiramento?

8

Estou criando um plug-in e quero obter a lista de todos os scripts e CSS usados por outros plug-ins.

Esta é minha função:

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

Eu quero obter o valor retornado dentro de uma variável.

Eu tentei isso:

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

E este é o meu resultado:

NULL

Se eu escrever echo dentro de cada foreach loop, obtenho os resultados corretos, mas como armazenar esses valores dentro de uma variável?

[editar]

Meu código dentro de um plugin que não está funcionando também

/**
 *  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' );
    
por Edouard Kombo 25.07.2016 / 16:44

2 respostas

7

do_action não funciona assim. Quando você chama do_action('crunchify_print_scripts_styles') , o WP verifica sua lista de ações registradas e filtros para qualquer um que esteja anexado a um gancho chamado crunchify_print_scripts_styles e, em seguida, executa essas funções.

E você provavelmente deseja remover isso:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

... porque você não consegue obter o resultado de retorno de sua função.

Além disso, quando você usa esse gancho em particular, não pode garantir que outras funções não enfileirem mais scripts ou estilos após que você gerou sua lista. Use um gancho que seja acionado depois que todos os scripts e estilos tiverem sido enfileirados, como wp_head, por conveniência ou, melhor ainda, apenas chame sua função dentro do tema quando desejar exibir o resultado.

Retrabalhar seu código como esse deve 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;
}

Depois, dentro do seu tema:

print_r( crunchify_print_scripts_styles() );

... mostrará os resultados para a depuração, ou claro ...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... lhe dará a lista para manipular.

Chamar no tema garante que você o chama depois que todos os scripts e estilos são enfileirados.

Para chamá-lo do seu plug-in, anexe-o a qualquer hook que seja executado depois de wp_enqueue_scripts, como wp_head, como mencionei acima:

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

}
    
por Andy Macaulay-Brook 25.07.2016 / 16:57
4

Você pode usar wp_print_scripts e wp_print_styles ações para acesso oportuno e adequado a scripts e estilos enfileirados, já que essas ações são os últimos eventos antes que os scripts e estilos sejam incluídos o documento e, por causa disso, o último evento em que as modificações em $wp_styles ou $wp_scripts poderiam ter efeito em estilos e scripts incluídos no documento.

Assim, eles são os eventos em que você pode ter mais confiança de que $wp_styles e $wp_scripts contêm os scripts e estilos efetivamente incluídos no 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;
    }
}

Se você declarar $enqueued_scripts adn $enqueued_styles como variáveis globais (ou qualquer outro escopo válido, por exemplo, você poderia armazená-lo na propriedade de um método), poderá acessar a lista de scripts e estilos em uma ação posterior.

Por exemplo (apenas um exemplo 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 );
} );
    
por cybmeta 25.07.2016 / 18:15