After updating a plugin, the network panel shows two similar bundles or the same URL appears twice. One request may come from the plugin’s new asset system while an old theme integration still adds the previous file. It may also be a misleading cache or redirect effect rather than a true duplicate.
Prove what executes twice before removing either copy.
Decide whether the requests are genuinely duplicate
Compare complete URLs, query strings, response sizes and content hashes. Files named frontend.min.js can belong to different components. The same URL shown twice may represent a preload followed by normal use; if correctly configured, the second entry can reuse the response rather than transfer it again.
Inspect the Initiator column. Record whether the request comes from initial HTML, another script, an iframe or CSS import.
Check the browser’s transferred bytes, not only resource size.
Reproduce outside the administrator session
Test in a private window with page, CDN and browser caches cold. Logged-in WordPress pages can include editor or toolbar assets that visitors never receive.
Compare a page created before the update with another template. If duplicates appear only where a widget is used, focus on that integration. If they appear everywhere, inspect global theme and plugin enqueues.
Preserve the plugin version and configuration in a restorable backup before changing production code.
Look for a legacy manual integration
Search the child theme, snippets plugin and custom site plugin for the old filename, plugin directory or CDN domain. A previous workaround may manually enqueue an asset that the new plugin now loads itself.
WordPress should register scripts and styles with unique handles and dependencies. Hard-coded <script> tags in header templates bypass that system and cannot be deduplicated reliably.
Remove a legacy include only after confirming the plugin’s replacement provides the same public functionality.
Inspect WordPress handles and dependency order
In a safe development environment, log or inspect registered enqueue handles. Two different handles can reference the same URL, so WordPress treats them as separate assets.
If custom code owns one registration, reuse the plugin’s documented handle or remove the custom enqueue. Avoid dequeuing by guessed handle on production; a changed dependency can make another component fail.
For JavaScript, check whether one file is a module build and another a compatibility build. Some browsers need a nomodule fallback, but incorrect attributes can make both execute.
Clear stale optimisation products
Minification and combination tools may retain an old aggregate while also discovering the plugin’s new file. Regenerate combined assets through the optimiser’s supported controls after taking note of current settings.
Purge the affected pages and CDN asset URLs. Do not delete broad server directories or flush every cache during high traffic without understanding the impact.
Inspect the final visitor HTML to confirm it references the new aggregate only once.
Check page-builder and widget duplication
The plugin may be embedded through both a shortcode and a builder widget. A desktop/mobile duplicate can initialise the same library twice even if only one component is visible.
Search the rendered DOM for repeated widget roots and duplicate IDs. Remove the redundant component at the editor/template level rather than hiding it with CSS.
Global pop-up or footer templates are another common source of invisible widgets on every page.
Verify behaviour after removing one owner
Clear relevant caches and reload several templates. Confirm transferred assets, console errors and interactive behaviour. Exercise menus, forms, sliders and the updated plugin’s feature.
If the duplicate previously caused two event handlers, check that clicks now execute once and analytics events are not doubled. Compare production only after staging behaviour is stable.
Request an assessment when asset ownership spans theme code, optimisation bundles and generated builder files. Provide the duplicate URLs, initiators and update timing; do not send passwords in the initial enquiry.