Comment obtenir une liste de tous les scripts et styles mis en file d'attente?

12

Je crée un plugin et je veux obtenir la liste de tous les scripts et CSS utilisés par d'autres plugins.

C'est ma fonction:

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

Je veux obtenir la valeur retournée dans une variable.

J'ai essayé ceci:

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

Et voici mon résultat:

NULL

Si j'écris à l' echointérieur de chaque foreachboucle, j'obtiens les résultats corrects, mais comment stocker ces valeurs dans une variable?

[Éditer]

Mon code dans un plugin qui ne fonctionne pas trop

/**
 *  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
la source
1
do_actionne renvoie pas de résultat, et d'ailleurs, l'action a déjà eu lieu à wp_enqueue_scripts... plus facile juste pour créer un global, par exemple. global $crunchifyenqueued; $crunchifyenqueued = $result;puis appelez à nouveau le global dans votre fonction ultérieure pour accéder à la variable.
majick
Merci pour votre réponse, mais cela n'a pas résolu le problème, la réponse pour var_dump ($ crunchifyenqueued) est "NULL".
Edouard Kombo
alors pourquoi ne pas utiliser apply_filtersalors? vous pouvez facilement en obtenir la valeur de retour.
majick
J'ai déjà essayé, je ne peux pas enregistrer le résultat dans une variable.
Edouard Kombo
bien sûr, vous pouvez en utilisant un global?
majick

Réponses:

11

do_actionne fonctionne pas tout à fait comme ça. Lorsque vous appelez do_action('crunchify_print_scripts_styles')WP, il examine sa liste d'actions enregistrées et les filtres de celles qui sont attachées à un hook appelé crunchify_print_scripts_styles, puis exécute ces fonctions.

Et vous voulez probablement supprimer ceci:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

... car vous ne pouvez pas obtenir le résultat de retour de votre fonction.

De plus, lorsque vous utilisez ce hook particulier, vous ne pouvez pas garantir que d'autres fonctions ne mettent pas en file d'attente plus de scripts ou de styles après avoir généré votre liste. Utilisez un crochet qui se déclenche après que tous les scripts et styles ont été mis en file d'attente, tels que wp_head, pour plus de commodité, ou mieux encore, appelez simplement votre fonction dans votre thème lorsque vous souhaitez afficher le résultat.

Retravailler votre code comme ça devrait fonctionner ...

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

Puis dans votre thème:

print_r( crunchify_print_scripts_styles() );

... vous montrera les résultats du débogage, ou bien sûr ...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... vous donnera la liste à manipuler.

L'appeler dans le thème garantit que vous l'appelez une fois tous les scripts et styles mis en file d'attente.

Pour l'appeler à partir de votre plugin, attachez-le à n'importe quel hook qui s'exécute après wp_enqueue_scripts, comme wp_head comme je l'ai mentionné ci-dessus:

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
la source
Merci @Andy, mais ce que je veux faire, c'est récupérer ces valeurs dans un plugin. Mon plugin renverra ces valeurs sous un format json.
Edouard Kombo
Ensuite, mettez à l' $all_the_scripts_and_styles = crunchify_print_scripts_styles();intérieur de votre plugin! Ajustement de la réponse pour convenir.
Andy Macaulay-Brook
Cela ne fonctionne pas, les scripts et les styles sont vides. Il semble que ce global wp_scripts global wp_stylessoit totalement vide. Mais ils travaillent avec undo_action or apply_filters
Edouard Kombo
Appelez-vous votre fonction plus tard que l' wp_enqueue_scriptsaction comme je l'avais recommandé à l'origine?
Andy Macaulay-Brook
J'ai élargi la réponse pour que ce soit plus clair.
Andy Macaulay-Brook
7

Vous pouvez utiliser wp_print_scriptset les wp_print_stylesactions à temps opportun et correctement l' accès aux scripts en file d' attente et de styles, comme ces actions sont les derniers événements avant les scripts et les styles sont inclus dans le document et, à cause de cela, le dernier cas où des modifications sur $wp_stylesou $wp_scriptspourrait avoir un effet sur les styles et scripts inclus dans le document.

Ce sont donc les événements où vous pouvez être plus confiant $wp_styleset $wp_scriptscontenir les scripts et les styles effectivement inclus dans le document.

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 vous déclarez $enqueued_scriptsadn en $enqueued_stylestant que variables globales (ou toute autre étendue valide, par exemple, vous pouvez le stocker dans la propriété d'une méthode), vous pouvez accéder à la liste des scripts et des styles dans une action ultérieure.

Par exemple (juste un petit exemple):

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
la source
0

Si vous voulez vraiment obtenir une liste de tous les styles, vous pouvez utiliser le nouveau filtre 'script_loader_tag' (depuis la version 4.1).

Le "wp_print_scripts" est:

Appelé par admin-header.php et le crochet 'wp_head'.

c'est-à-dire qu'il n'affiche pas les scripts dans le pied de page.

Les références:

Ajouter des attributs Defer & Async aux scripts WordPress

wp_print_scripts

theuberdog
la source
Avez-vous un exemple sur la façon de l'utiliser?
lonix