Skip to content

Instantly share code, notes, and snippets.

@stevygee
Created March 4, 2021 11:07
Show Gist options
  • Save stevygee/458196f91c595ba1b69e394d55426bc2 to your computer and use it in GitHub Desktop.
Save stevygee/458196f91c595ba1b69e394d55426bc2 to your computer and use it in GitHub Desktop.
List all enqueued scripts and styles on the current page. This won't work as an REST API endpoint, unfortunately. If that's your goal, use Frontity's head tags plugin and disable filtering of scripts and styles.
global $enqueued_scripts;
global $enqueued_styles;
function sg_format_asset_url( $src, $ver ) {
// Fallback to WP version, if not set
$ver = $ver ? $ver : get_bloginfo( 'version', 'display' );
// Append site root URL, if missing
$url = strpos( $src, get_home_url() ) !== false ? $src : get_home_url() . $src;
// Cache busting
$url .= '?ver=' . $ver;
return $url;
}
function sg_walk_dependencies( $asset, $is_script ) {
global $wp_scripts;
global $wp_styles;
$urls = array();
if( $asset->deps ) {
foreach( $asset->deps as $handle ) {
// Get object for this dependency
$dep = $is_script ? $wp_scripts->registered[$handle] : $wp_styles->registered[$handle];
if( $dep->deps ) {
// This dependency has more dependencies! Do a recursion
$urls[] = sg_walk_dependencies( $dep, $is_script );
} elseif( false !== $dep->src ) {
// Store URL of dependency
$urls[] = sg_format_asset_url( $dep->src, $dep->ver );
}
}
}
// Store asset after its dependencies
if( false !== $asset->src ) {
// Add inline scripts/styles
if ( $asset->extra ) {
$inline_script = array_key_exists( 'data', $asset->extra ) ? $asset->extra['data'] : '';
$inline_script = array_key_exists( 'after', $asset->extra ) ? implode( '', $asset->extra['after'] ) : '';
$inline_script = trim( $inline_script );
if ( $inline_script ) {
if ( $is_script ) {
$urls[] = '<script type="text/javascript" id="' . $asset->handle . '-js-after">
' . $inline_script . '
</script>';
} else {
$urls[] = '<style type="text/css" id="' . $asset->handle . '-inline-css">
' . $inline_script . '
</style>';
}
}
}
// Store URL
if ( $asset->src ) {
$urls[] = sg_format_asset_url( $asset->src, $asset->ver );
}
}
return $urls;
}
function sg_format_dependencies( $enqueued_assets ) {
// Flatten the array:
// 1. Recursively iterate the array iterator
$output_array_obj = new RecursiveIteratorIterator(
new RecursiveArrayIterator( $enqueued_assets ) );
// 2. Copy the iterator into an array
$enqueued_assets = iterator_to_array( $output_array_obj, false );
// Clean up duplicate assets
$enqueued_assets = array_unique( $enqueued_assets );
return $enqueued_assets;
}
function sg_list_scripts() {
global $wp_scripts;
global $enqueued_scripts;
$enqueued_scripts = array();
foreach( $wp_scripts->queue as $handle ) {
$enqueued_scripts[] = sg_walk_dependencies( $wp_scripts->registered[$handle], true );
//$enqueued_scripts[] = print_r( $wp_scripts->registered[$handle], true);
}
$enqueued_scripts = sg_format_dependencies( $enqueued_scripts );
}
add_action( 'wp_print_scripts', 'sg_list_scripts' );
function sg_list_styles() {
global $wp_styles;
global $enqueued_styles;
$enqueued_styles = array();
foreach( $wp_styles->queue as $handle ) {
$enqueued_styles[] = sg_walk_dependencies( $wp_styles->registered[$handle], false );
//$enqueued_styles[] = print_r( $wp_styles->registered[$handle], true);
}
$enqueued_styles = sg_format_dependencies( $enqueued_styles );
}
add_action( 'wp_print_styles', 'sg_list_styles' );
add_action( 'wp_head', function() {
global $enqueued_scripts;
echo '<pre>';
echo esc_html( print_r( $enqueued_scripts, true ) );
echo '</pre>';
global $enqueued_styles;
echo '<pre>';
echo esc_html( print_r( $enqueued_styles, true ) );
echo '</pre>';
} );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment