I'm creating a plugin and I want to get the list of all scripts and CSS used by other plugins.

This is my function:

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

I want to get the returned value inside a variable.

I tried this:

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

And this is my result:

NULL

If I write echo inside every foreach loop, I get the correct results, but how to store these values inside a variable?

[edit]

My code inside a pluginm which is not working too

/**
 *  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_action does not return a result, and besides, the action has already taken place at wp_enqueue_scripts ... easier just to create a global, eg. global $crunchifyenqueued; $crunchifyenqueued = $result; then again call the global in your later function to access the variable. – majick Jul 25 '16 at 14:54
  • Thanks for your answer, but it didn't solve the problem, the response for var_dump($crunchifyenqueued) is "NULL". – Edouard Kombo Jul 25 '16 at 15:09
  • so why not use apply_filters then? you can easily get the return value from that. – majick Jul 25 '16 at 15:57
  • I already tried, I can't save the result inside a variable. – Edouard Kombo Jul 27 '16 at 8:04
  • of course you can by using a global? – majick Jul 27 '16 at 8:49
up vote 7 down vote accepted

do_action doesn't quite work like that. When you call do_action('crunchify_print_scripts_styles') WP looks at its list of registered actions and filters for any that are attached to a hook called crunchify_print_scripts_styles and then runs those functions.

And you probably want to remove this:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

... because you aren't able to get the return result of your function.

Also when you use this particular hook you can't guarantee that other functions don't enqueue more scripts or styles after you've generated your list. Use a hook that fires after all scripts and styles have been enqueued, such as wp_head, for convenience, or better still just call your function within your theme when you want to display the result.

Reworking your code like this should work...

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

Then within your theme:

print_r( crunchify_print_scripts_styles() );

... will show you the results for debugging, or of course...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... will give you the list to manipulate.

Calling it in the theme makes sure you call it after all scripts and styles are enqueued.

To call it from your plugin, attach it to any hook that runs later than wp_enqueue_scripts, like wp_head as I mentioned above:

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

}
  • Thanks @Andy, but what I want to do is to get these values inside a plugin. My plugin will return these values under a json format. – Edouard Kombo Jul 25 '16 at 15:03
  • Then put $all_the_scripts_and_styles = crunchify_print_scripts_styles(); inside your plugin! Tweaked the answer to suit. – Andy Macaulay-Brook Jul 25 '16 at 15:06
  • It doesn't work, both scripts and styles are empty. It seems like global wp_scripts global wp_styles are totally empty. But they work with a do_action or apply_filters – Edouard Kombo Jul 25 '16 at 15:15
  • Are you calling your function later than the wp_enqueue_scripts action as I recommended originally? – Andy Macaulay-Brook Jul 25 '16 at 15:17
  • I've expanded the answer to make that clearer. – Andy Macaulay-Brook Jul 25 '16 at 15:21

You could use wp_print_scripts and wp_print_styles actions to timely and properly access to enqueued scripts and styles, as these actions are the last events before scripts and styles are included in the document and, because of that, the last event where modifications on $wp_styles or $wp_scripts could have effect on styles and scripts included in the document.

So, they are the events where you can be more confident that $wp_styles and $wp_scripts contain the scripts and styles effectively included in the 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;
    }
}

If you declare $enqueued_scripts adn $enqueued_styles as global variables (or any other valid scope, for example you could store it in a method's property), you could access to the list of script and styles in a later action.

For example (just a quick example):

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

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.