• Skip to secondary menu
  • Skip to main content
  • Skip to primary sidebar
  • Home
  • Projects
  • Products
  • Themes
  • Tools
  • Request for Quote

Vengala Vinay

Having 12+ Years of Experience in Software Development

  • Home
  • WordPress
  • PHP
    • Codeigniter
  • Django
  • Magento
  • Selenium
  • Server
Home » Fixing Enqueued scripts loaded in incorrect footer sequence in WordPress Themes Using Custom Action and Filter Hooks

Fixing Enqueued scripts loaded in incorrect footer sequence in WordPress Themes Using Custom Action and Filter Hooks

Diagnosing Script Loading Order Issues in WordPress

A common, yet often frustrating, issue in WordPress theme development is the incorrect sequencing of enqueued JavaScript files. This typically manifests as a script failing to execute because its dependencies haven’t loaded yet, or a script attempting to manipulate the DOM before the DOM is fully ready. While WordPress’s `wp_enqueue_script` function is designed to manage dependencies, theme developers sometimes introduce complexities that lead to these ordering problems, especially when dealing with custom scripts or third-party plugins that also enqueue their own assets.

The root cause often lies in how scripts are registered and enqueued, particularly when developers rely on the default `wp_enqueue_scripts` action hook without fully understanding its implications for execution order. When multiple scripts are enqueued on the same hook, their order is generally determined by the order in which they are called within the theme’s `functions.php` or included template files. However, this can become chaotic with conditional loading, plugin interactions, and the desire to load scripts in the footer for performance optimization.

Understanding `wp_enqueue_script` and its Parameters

Before diving into solutions, it’s crucial to revisit the parameters of `wp_enqueue_script`:

  • $handle (string, required): Unique name of the script.
  • $src (string, optional): Full URL to the script.
  • $deps (array, optional): Array of handles of scripts that this script depends on.
  • $ver (string|bool|null, optional): Version number of the script.
  • $in_footer (bool, optional): Whether to enqueue the script in the footer. Defaults to false (in the <head>).

The $in_footer parameter is key here. Setting it to true tells WordPress to output the script tag just before the closing </body> tag. However, if a script that relies on another script set to load in the footer is *not* set to load in the footer, or if it’s enqueued *after* its dependency in the footer, the dependency issue will persist.

The Problem: Scripts Enqueued in the Wrong Footer Sequence

Consider a scenario where you have a main JavaScript file, theme-main.js, which depends on a utility library, theme-utilities.js. Both are intended to be loaded in the footer for performance.

A naive implementation in functions.php might look like this:

function theme_enqueue_scripts() {
    // Enqueue the utility script first
    wp_enqueue_script(
        'theme-utilities',
        get_template_directory_uri() . '/js/theme-utilities.js',
        array(),
        '1.0.0',
        true // Load in footer
    );

    // Enqueue the main script, declaring dependency
    wp_enqueue_script(
        'theme-main',
        get_template_directory_uri() . '/js/theme-main.js',
        array('theme-utilities'), // Depends on theme-utilities
        '1.0.0',
        true // Load in footer
    );
}
add_action('wp_enqueue_scripts', 'theme_enqueue_scripts');

In this case, WordPress correctly identifies the dependency. If theme-main is enqueued *after* theme-utilities, and both have $in_footer set to true, they will likely appear in the correct order in the footer. However, the problem arises when other scripts are enqueued, either by the theme or by plugins, on the same wp_enqueue_scripts hook, or even on subsequent hooks that fire before the footer scripts are rendered.

A more complex scenario involves conditional loading or when a script is enqueued without explicitly setting $in_footer to true, but its dependency *is*. This can lead to the dependency being placed in the footer while the script that needs it remains in the <head>, or vice-versa, breaking the execution flow.

Leveraging `wp_print_scripts` and `wp_print_footer_scripts`

WordPress provides specific action hooks for printing scripts: wp_print_scripts (for scripts in the <head>) and wp_print_footer_scripts (for scripts in the footer). By default, wp_enqueue_script with $in_footer = true hooks into wp_print_footer_scripts. Scripts enqueued without $in_footer = true hook into wp_print_scripts.

When you encounter ordering issues, especially with footer scripts, it often means that the default behavior isn’t sufficient. You might need to manually control where and when scripts are printed. This is where custom actions and filters become powerful.

Customizing Script Output with Filters

The script_loader_tag filter allows you to modify the HTML output of each script tag before it’s printed. This is useful for adding attributes like defer or async, but it can also be used to subtly influence order if you’re willing to dig into the output buffer.

However, a more robust approach for reordering is to intercept the script queue itself. The $wp_scripts global object, an instance of WP_Scripts, manages all enqueued scripts. You can access and manipulate this object.

Advanced Technique: Reordering Scripts via `wp_scripts_collection_ready` Filter

A highly effective, albeit advanced, method is to use the wp_scripts_collection_ready filter. This filter fires after all scripts have been registered and enqueued, but before they are printed. It provides access to the WP_Scripts object, allowing you to reorder the queue directly.

Let’s say you have theme-utilities.js and theme-main.js, and you’ve observed that due to some plugin interference or a complex theme structure, theme-main.js is being printed before theme-utilities.js in the footer, causing errors.

Here’s how you can force the correct order:

function theme_reorder_footer_scripts( $scripts ) {
    // Get the list of scripts intended for the footer.
    // $scripts->in_footer is an array of script handles.
    $footer_scripts = $scripts->in_footer;

    // Define the desired order for specific scripts.
    $desired_order = array(
        'theme-utilities', // Ensure this loads first
        'theme-main',      // Ensure this loads second
        // ... other scripts that should follow
    );

    // Filter out the scripts we want to reorder from the original footer list.
    $scripts_to_reorder = array_intersect( $footer_scripts, $desired_order );

    // Remove these scripts from their original positions in the footer queue.
    $footer_scripts = array_diff( $footer_scripts, $scripts_to_reorder );

    // Re-insert the scripts in the desired order at the beginning of the footer queue.
    // We prepend them to ensure they are processed first among footer scripts.
    $scripts->in_footer = array_merge( $scripts_to_reorder, $footer_scripts );

    // Important: Ensure dependencies are still respected.
    // The WP_Scripts object handles dependency resolution internally when printing.
    // This reordering primarily affects the *output order* if dependencies are met.
    // If a script's dependency is NOT in the footer queue, it will still be printed
    // in the head by default, which might still cause issues.
    // For true control, ensure all related scripts are enqueued with $in_footer = true.

    return $scripts;
}
add_filter( 'wp_scripts_collection_ready', 'theme_reorder_footer_scripts' );

// Ensure our scripts are enqueued with $in_footer = true
function theme_enqueue_scripts_for_reorder() {
    // Enqueue the utility script first
    wp_enqueue_script(
        'theme-utilities',
        get_template_directory_uri() . '/js/theme-utilities.js',
        array(),
        '1.0.0',
        true // Load in footer
    );

    // Enqueue the main script, declaring dependency
    wp_enqueue_script(
        'theme-main',
        get_template_directory_uri() . '/js/theme-main.js',
        array('theme-utilities'), // Depends on theme-utilities
        '1.0.0',
        true // Load in footer
    );

    // Enqueue another script that might interfere or needs to be placed later
    wp_enqueue_script(
        'theme-other-script',
        get_template_directory_uri() . '/js/theme-other-script.js',
        array(),
        '1.0.0',
        true // Load in footer
    );
}
add_action('wp_enqueue_scripts', 'theme_enqueue_scripts_for_reorder');

In this example:

  • We hook into wp_scripts_collection_ready, receiving the WP_Scripts object.
  • We extract the handles of scripts marked for footer output ($scripts->in_footer).
  • We define an array $desired_order specifying the exact sequence for our critical scripts.
  • We use array_intersect and array_diff to isolate the scripts we want to reorder and remove them from their original positions.
  • Finally, we prepend the reordered scripts back into the $scripts->in_footer array, ensuring they appear first in the footer output.

This method is powerful because it manipulates the queue *before* WordPress iterates through it to print the script tags. It effectively overrides any unintended ordering caused by other enqueues or internal WordPress logic.

Debugging Script Loading Order

When faced with these issues, a systematic debugging approach is essential:

  • Inspect the HTML Source: The first step is always to view the page source in your browser and examine the order of <script> tags in both the <head> and before the closing </body>.
  • Use Browser Developer Tools: The Network tab in browser developer tools (Chrome DevTools, Firefox Developer Edition) can show you the order in which scripts are loaded and any errors that occur during execution. Look for “Uncaught ReferenceError” or similar messages.
  • Temporarily Disable Plugins: A common culprit for script conflicts is a plugin. Deactivate all plugins except those essential for your theme’s functionality and re-test. If the issue disappears, reactivate plugins one by one to identify the offender.
  • Simplify Theme Code: Temporarily remove custom script enqueues from your theme’s functions.php and template files to isolate the problem to your theme’s code.
  • Log Script Queues: You can log the contents of $scripts->queue and $scripts->in_footer at various points to understand how they are being populated and ordered.
function debug_script_queue() {
    if ( ! current_user_can('manage_options') ) {
        return;
    }
    global $wp_scripts;

    echo '<pre>';
    echo '--- WP_SCRIPTS QUEUE ---' . "\n";
    echo 'Queue: ' . print_r( $wp_scripts->queue, true ) . "\n";
    echo 'In Footer: ' . print_r( $wp_scripts->in_footer, true ) . "\n";
    echo '--- END WP_SCRIPTS QUEUE ---' . "\n";
    echo '</pre>';
}
// Add this hook to a point where scripts are likely finalized, e.g., wp_print_scripts
// or even wp_footer for footer scripts. Be mindful of output order.
add_action('wp_head', 'debug_script_queue');

By combining these debugging techniques with the advanced reordering strategy using wp_scripts_collection_ready, you can effectively resolve complex script sequencing issues in WordPress themes, ensuring a stable and performant user experience.

Primary Sidebar

A little about the Author

Having 12+ Years of Experience in Software Development, Vinay is a principal software architect, senior systems engineer, and elite technical consultant. He specializes in bespoke PHP/WordPress development, high-performance Magento 2 & Shopify architectures, custom plugin/theme development from scratch, and legacy code modernization (including VB6, VB.NET, PyQt, and Crystal Reports). Known for solving complex database bottlenecks, speed optimization (Core Web Vitals), and advanced security code auditing, Vinay engineers production-ready systems designed to scale under heavy concurrent load conditions.



Chat on WhatsApp

Recent Posts

  • Top 100 Developer Tooling and Productivity SaaS Ideas to Launch in 2026 to Boost Organic Search Growth by 200%
  • Top 100 Developer-Centric Code Snippet Managers and Customization Plugins to Double User Engagement and Session Duration
  • Top 5 API Monetization Frameworks and Gateway Strategies for Developers to Minimize Server Costs and Load Overhead
  • Top 50 Automated PDF & Document Generation Tool Ideas for Developers to Minimize Server Costs and Load Overhead
  • Top 50 Premium Newsletter and Subscription Business Models for Devs for High-Traffic Technical Portals

Categories

  • apache (1)
  • Business & Monetization (386)
  • Centos (4)
  • Comparisons & Decision Making (55)
  • Debian (2)
  • Debugging & Troubleshooting (564)
  • DevOps (7)
  • DevOps & Cloud Scaling (949)
  • Django (1)
  • Migration & Architecture (167)
  • MySQL (1)
  • Performance & Optimization (754)
  • PHP (5)
  • Plugins & Themes (223)
  • Security & Compliance (539)
  • SEO & Growth (483)
  • Server (23)
  • Ubuntu (9)
  • WordPress (22)
  • WordPress Plugin Development (7)
  • WordPress Theme Development (303)

Recent Posts

  • Top 100 Developer Tooling and Productivity SaaS Ideas to Launch in 2026 to Boost Organic Search Growth by 200%
  • Top 100 Developer-Centric Code Snippet Managers and Customization Plugins to Double User Engagement and Session Duration
  • Top 5 API Monetization Frameworks and Gateway Strategies for Developers to Minimize Server Costs and Load Overhead
  • Top 50 Automated PDF & Document Generation Tool Ideas for Developers to Minimize Server Costs and Load Overhead
  • Top 50 Premium Newsletter and Subscription Business Models for Devs for High-Traffic Technical Portals
  • Top 100 SEO and Schema Markup Plugins for Headless Decoupled Sites for Independent Web Developers and Indie Hackers

Top Categories

  • DevOps & Cloud Scaling (949)
  • Performance & Optimization (754)
  • Debugging & Troubleshooting (564)
  • Security & Compliance (539)
  • SEO & Growth (483)
  • Business & Monetization (386)

Our Products

  • School Management & Student Administration System
  • Integrated Hospital & Clinic Management System
  • Real Estate Directory & Agent Portal
  • Restaurant POS & Table Booking System
  • Retail Inventory POS & Billing System
  • Pharmacy Inventory & Clinic Billing System

Our Services

  • Vibe Engineering & AI Code Auditing Services
  • Prompt Engineering & "Vibe Coding" Workflow Consulting
  • AI-Augmented "Vibe Coding" & Rapid MVP Development
  • Figma to Shopify Liquid Theme Customization
  • Figma to WooCommerce Frontend Development
  • Figma to Magento 2 Theme Development

Copyright © 2026 · Vinay Vengala