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

12

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

Esta é a 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 echodentro de cada foreachloop, obtenho os resultados corretos, mas como armazenar esses valores dentro de uma variável?

[editar]

Meu código dentro de um pluginm que não está funcionando muito

/**
 *  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
fonte
1
do_actionnão retorna um resultado e, além disso, a ação já ocorreu em wp_enqueue_scripts... mais fácil apenas para criar um global, por exemplo. global $crunchifyenqueued; $crunchifyenqueued = $result;em seguida, chame novamente o global em sua função posterior para acessar a variável.
25916
Obrigado pela sua resposta, mas não resolveu o problema, a resposta para var_dump ($ crunchifyenqueued) é "NULL".
Edouard Kombo
então porque não usar apply_filtersentão? você pode facilmente obter o valor de retorno disso.
25916
Eu já tentei, não consigo salvar o resultado dentro de uma variável.
Edouard Kombo
claro que você pode usando um global?
27516

Respostas:

11

do_actionnão funciona bem assim. Quando você liga, o do_action('crunchify_print_scripts_styles')WP examina sua lista de ações e filtros registrados para qualquer um que esteja anexado a um gancho chamado crunchify_print_scripts_stylese executa essas funções.

E você provavelmente deseja remover isso:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

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

Além disso, quando você usa esse gancho específico, não pode garantir que outras funções não enfileirem mais scripts ou estilos depois de gerar sua lista. Use um gancho que é acionado após todos os scripts e estilos terem sido enfileirados, como wp_head, por conveniência, ou melhor ainda, basta chamar sua função dentro do seu tema quando desejar exibir o resultado.

Retrabalhar seu código dessa maneira 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;
}

Então, dentro do seu tema:

print_r( crunchify_print_scripts_styles() );

... mostrará os resultados da depuração ou, é claro ...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... lhe dará a lista para manipular.

A chamada no tema garante que você o chame após todos os scripts e estilos serem enfileirados.

Para chamá-lo a partir do seu plug-in, anexe-o a qualquer gancho 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

}
Andy Macaulay-Brook
fonte
Obrigado @ Andy, mas o que eu quero fazer é obter esses valores dentro de um plugin. Meu plugin retornará esses valores em um formato json.
Edouard Kombo
Em seguida, coloque $all_the_scripts_and_styles = crunchify_print_scripts_styles();dentro do seu plugin! Ajustou a resposta para se adequar.
Andy Macaulay-Brook
Não funciona, scripts e estilos estão vazios. Parece que global wp_scripts global wp_stylesestão totalmente vazios. Mas eles trabalham com umdo_action or apply_filters
Edouard Kombo
Você está chamando sua função depois da wp_enqueue_scriptsação, como eu recomendei originalmente?
Andy Macaulay-Brook
Expandi a resposta para deixar isso mais claro.
Andy Macaulay-Brook
7

Você pode usar wp_print_scriptse wp_print_stylesações para acessar oportuna e adequadamente scripts e estilos enfileirados, pois essas são os últimos eventos antes da inclusão de scripts e estilos no documento e, por isso, o último evento em que modificações $wp_stylesou $wp_scriptspodem ter efeito sobre estilos e scripts incluídos no documento.

Portanto, são os eventos em que você pode ter mais confiança $wp_stylese $wp_scriptsconter 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_scriptsadn $enqueued_stylescomo variáveis ​​globais (ou qualquer outro escopo válido, por exemplo, poderá 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 );
} );
cybmeta
fonte
0

Se você realmente deseja obter uma lista de todos os estilos, pode usar o novo filtro 'script_loader_tag' (desde a versão 4.1).

O "wp_print_scripts" é:

Chamado pelo admin-header.php e pelo gancho 'wp_head'.

isto é, não mostra scripts no rodapé.

Referências:

Adicionar Atributos Adiados e Assíncronos aos Scripts do WordPress

wp_print_scripts

theuberdog
fonte
Você talvez tenha um exemplo de como usar isso?
lonix 15/01