web-dev-qa-db-fra.com

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

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

Ceci 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 renvoyée à l'intérieur d'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 echo dans chaque boucle foreach, j'obtiens les résultats corrects, mais comment stocker ces valeurs dans une variable?

[modifier]

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' );
9
Edouard Kombo

do_action ne fonctionne pas vraiment comme ça. Lorsque vous appelez do_action('crunchify_print_scripts_styles'), WP, consultez la liste des actions enregistrées et des filtres pour toutes les actions liées à un hook appelé crunchify_print_scripts_styles, puis lance ces fonctions.

Et vous voudrez probablement enlever ceci:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

... parce que vous ne parvenez pas à obtenir le résultat 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 davantage de scripts ou de styles après vous avez généré votre liste. Utilisez un hook qui se déclenche une fois que tous les scripts et styles ont été mis en file d'attente, tel que wp_head, pour des raisons pratiques ou, mieux encore, appelez simplement votre fonction dans votre thème lorsque vous souhaitez afficher le résultat.

Retravailler votre code comme ça devrait marcher ...

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 pour le 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 vous permet de l'appeler une fois que tous les scripts et styles ont été mis en file d'attente.

Pour l'appeler depuis votre plugin, attachez-le à tout hook fonctionnant 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

}
10
Andy Macaulay-Brook

Vous pouvez utiliser wp_print_scripts et wp_print_styles actions pour en temps voulu et correctement accès aux scripts et styles en file d'attente, car ces actions sont les derniers événements avant l'intégration des scripts et des styles dans le document et, à cause de cela, le dernier événement où des modifications sur $wp_styles ou $wp_scripts pourrait avoir une incidence sur les styles et les scripts inclus dans le document.

Ce sont donc des événements où vous pouvez être plus sûr que $wp_styles et $wp_scripts contiennent 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_scripts adn $enqueued_styles en tant que variables globales (ou toute autre étendue valide, par exemple, vous pouvez le stocker dans la propriété d'une méthode), vous pourrez accéder à la liste des scripts et des styles lors d'une action ultérieure.

Par exemple (juste un exemple rapide):

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

Si vous voulez vraiment obtenir une liste de all 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 hook ‘wp_head’.

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

Références:

Ajouter des attributs différés et asynchrones à des scripts WordPress

wp_print_scripts

0
theuberdog