Developer Hooks for Better WooCommerce Performance (With Code Examples)
When you outgrow simple plugin settings and need deeper control over WooCommerce performance, hooks become your best tool. With a few lines of code, you can remove heavy scripts, fine-tune image sizes, limit cart fragments, and move slow tasks into the background.
This guide walks through practical developer hooks for WooCommerce performance. You will see where to place the code, how each snippet helps, and what to test before deploying changes on a busy store.
Where to Put Performance Hooks
Use a Child Theme or Custom Plugin
Never paste performance hooks into a parent theme’s functions.php file. Updates can overwrite your work and break your changes. Instead, use one of these safe options:
- Child theme
functions.phpfor small, theme-specific tweaks. - Must-use plugin (MU plugin) for critical performance logic that must always load.
- Custom plugin with its own folder and file if you prefer a cleaner separation of concerns.
Whichever you choose, add hooks in small, well-named functions, and document the intent so future you (or another developer) knows why they exist.
Control Scripts and Styles With Hooks
Dequeue Heavy Assets on Sensitive Pages
Many performance issues start with unnecessary scripts and styles loading on every page. With wp_enqueue_scripts, you can remove assets selectively, especially on cart and checkout, where every millisecond counts.
Example: Remove Unused Assets on Cart and Checkout
add_action( 'wp_enqueue_scripts', 'wpheadliner_optimize_assets', 99 );
function wpheadliner_optimize_assets() {
// Checkout & cart: keep things as light as possible.
if ( is_cart() || is_checkout() ) {
// Example: Contact Form 7 (not used on checkout).
wp_dequeue_script( 'contact-form-7' );
wp_dequeue_style( 'contact-form-7' );
// Example: slider or popup scripts.
wp_dequeue_script( 'my-heavy-slider' );
wp_dequeue_style( 'my-heavy-slider' );
}
// Non-store pages: strip WooCommerce assets whenever safe.
if ( ! is_woocommerce() && ! is_cart() && ! is_checkout() ) {
wp_dequeue_style( 'woocommerce-general' );
wp_dequeue_style( 'woocommerce-layout' );
wp_dequeue_style( 'woocommerce-smallscreen' );
wp_dequeue_script( 'wc-add-to-cart' );
}
}
When to use: Your waterfall chart shows multiple front-end libraries you are not using on key WooCommerce pages, or your checkout is overloaded with marketing widgets and popups.
Disable Built-In WooCommerce Styles You Do Not Need
WooCommerce loads a few CSS files by default. With the woocommerce_enqueue_styles filter, you can unregister styles that your theme already covers, avoiding duplicate CSS.
add_filter( 'woocommerce_enqueue_styles', 'wpheadliner_woocommerce_styles' );
function wpheadliner_woocommerce_styles( $styles ) {
// Remove the smallscreen stylesheet if your theme handles responsiveness.
if ( isset( $styles['woocommerce-smallscreen'] ) ) {
unset( $styles['woocommerce-smallscreen'] );
}
// Or, if your theme fully styles WooCommerce, you can strip everything:
// $styles = array();
return $styles;
}
When to use: Your theme is WooCommerce-optimized, and you see duplicated styling or large CSS bundles in performance reports. This hook works best when your theme fully handles responsive styling.
Reduce Cart Fragment Overhead
What Cart Fragments Do
wc-cart-fragments keeps the mini-cart in sync via AJAX after users add items. This is convenient but can generate a lot of requests, especially on high-traffic sites.
Disable Cart Fragments Where They Are Not Needed
On pages where the mini-cart is not visible or not critical, you can dequeue the script to reduce background requests.
add_action( 'wp_enqueue_scripts', 'wpheadliner_maybe_disable_cart_fragments', 999 );
function wpheadliner_maybe_disable_cart_fragments() {
// Only keep cart fragments on pages where the mini cart matters.
if ( ! is_cart() && ! is_checkout() && ! is_product() && ! is_page( 'shop' ) ) {
wp_dequeue_script( 'wc-cart-fragments' );
}
}
When to use: Your monitoring tools show many repeated wc-ajax=get_refreshed_fragments calls, or performance reports highlight cart fragments as a bottleneck, and you do not rely on a live-updating mini-cart on every page.
Tune Images and Frontend Assets With Hooks
Set Smarter WooCommerce Image Sizes
Oversized product images slow pages and can trigger layout shifts. WooCommerce exposes image size filters so you can control dimensions in code instead of only through the UI.
Example: Tighter Image Dimensions for Singles and Thumbnails
add_filter( 'woocommerce_get_image_size_single', 'wpheadliner_single_image_size' );
function wpheadliner_single_image_size( $size ) {
return array(
'width' => 900, // adjust to your design
'height' => 900,
'crop' => 1,
);
}
add_filter( 'woocommerce_get_image_size_thumbnail', 'wpheadliner_thumb_image_size' );
function wpheadliner_thumb_image_size( $size ) {
return array(
'width' => 400,
'height' => 400,
'crop' => 1,
);
}
After changing image sizes, regenerate thumbnails and test product pages on both desktop and mobile to confirm quality and layout.
When to use: Your product pages feel heavy, Lighthouse flags large image payloads, or thumbnails look inconsistent across grids and carousels.
Defer Non-Critical JavaScript
Some scripts do not need to block rendering. With the script_loader_tag filter, you can add defer or async to selected handles while leaving critical checkout and payment scripts untouched.
add_filter( 'script_loader_tag', 'wpheadliner_defer_non_critical_scripts', 10, 3 );
function wpheadliner_defer_non_critical_scripts( $tag, $handle, $src ) {
// Never touch core WooCommerce or payment scripts.
$critical = array(
'woocommerce',
'wc-cart-fragments',
'stripe',
'paypal-checkout'
);
if ( in_array( $handle, $critical, true ) ) {
return $tag;
}
// Example: defer a marketing script.
if ( 'my-marketing-tool' === $handle ) {
$tag = '<script src="' . esc_url( $src ) . '" defer></script>';
}
return $tag;
}
When to use: PageSpeed Insights reports render-blocking JavaScript or long main-thread tasks caused by third-party tools such as chat, marketing, or tracking scripts—especially on product and category pages.
Run Heavy Logic Only on Store Pages
Short-Circuit on Non-WooCommerce Views
Some themes and plugins run expensive logic on every page load. You can shield non-store pages using WooCommerce conditionals inside general WordPress hooks like template_redirect or init.
add_action( 'template_redirect', 'wpheadliner_only_for_store' );
function wpheadliner_only_for_store() {
if ( ! is_woocommerce() && ! is_cart() && ! is_checkout() ) {
return; // bail early for blog, landing pages, etc.
}
// Any logic here runs only on store-related pages.
// Example: custom tracking or layout tweaks.
}
This pattern is simple but effective: it prevents unnecessary work on your blog, marketing pages, or custom landing pages where WooCommerce performance logic is irrelevant.
When to use: You have custom code or plugins that run on every request, but they are only needed for store pages like product, cart, and checkout.
Optimize Orders and Background Tasks With Hooks
Use HPOS and Order Hooks for Scalability
When using High Performance Order Storage (HPOS), WooCommerce stores orders in dedicated tables for better scalability. You can combine this with order hooks to keep the checkout path light and offload heavy tasks.
Example: Offload Slow Tasks on woocommerce_new_order
add_action( 'woocommerce_new_order', 'wpheadliner_after_new_order', 20, 2 );
function wpheadliner_after_new_order( $order_id, $order ) {
// Avoid heavy work directly in this hook.
// Instead, queue tasks for later via cron or a job system.
// Example: enqueue a background task (simplified).
wp_schedule_single_event(
time() + 60,
'wpheadliner_process_order_in_background',
array( $order_id )
);
}
add_action( 'wpheadliner_process_order_in_background', 'wpheadliner_process_order_callback' );
function wpheadliner_process_order_callback( $order_id ) {
$order = wc_get_order( $order_id );
// Now perform heavier actions:
// - Sync with CRM or ERP
// - Send data to external analytics
// - Generate and email PDF invoice, etc.
}
Goal: Keep the critical path (customer clicking “Place order”) as short as possible. Anything not essential for that moment should run later.
When to use: You notice long checkout completion times, slow order creation, or PHP timeouts when many integrations fire as soon as an order is placed.
Daily Cleanup With Custom Cron Hooks
Database and transient bloat can slow every request over time. Custom cron jobs let you run cleanups during low-traffic periods.
// Schedule a daily cleanup task if not already scheduled.
if ( ! wp_next_scheduled( 'wpheadliner_daily_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpheadliner_daily_cleanup' );
}
add_action( 'wpheadliner_daily_cleanup', 'wpheadliner_run_daily_cleanup' );
function wpheadliner_run_daily_cleanup() {
global $wpdb;
// Remove expired transients.
$wpdb->query(
"DELETE FROM {$wpdb->options}
WHERE option_name LIKE '_transient_timeout_%'
AND option_value < UNIX_TIMESTAMP()"
);
// You can add more maintenance here:
// - Clear custom logs
// - Rotate integration queues
// - Run lightweight DB optimizations via plugins.
}
When to use: Your options table has grown large, you see lots of transients in status tools, or database size keeps creeping up and impacting backups and query time.
Testing and Safety Checklist
Test Hooks Like Features, Not Experiments
Each performance hook should go through the same basic process as a new feature:
- Implement the hook on a staging site.
- Run PageSpeed or WebPageTest before and after to confirm impact.
- Test add-to-cart, coupons, and checkout on desktop and mobile.
- Check payment gateways, shipping calculators, and taxes.
- Deploy to production during lower traffic hours and monitor logs.
Roll Back Quickly if Needed
When performance changes go wrong, they usually show up as broken carts, missing scripts, or checkout errors. Keep a simple rollback plan:
- Use version control for your theme and custom plugin.
- Tag releases and revert quickly if errors appear.
- Keep an emergency note of which hooks were changed in each release.
Conclusion: Make Hooks Part of Your Performance Toolkit
Developer hooks give you a fine-grained way to improve WooCommerce performance beyond what settings screens allow. By controlling scripts and styles, limiting cart fragments, tuning image sizes, and moving heavy tasks into the background, you create a store that feels lighter without sacrificing features.
Start with the least risky hooks—such as removing obviously unused assets on checkout—and measure results. Then, iterate slowly, adding more advanced patterns like deferred scripts, background order processing, and scheduled cleanup tasks.
Combined with the broader practices in your main WooCommerce performance tips guide, these developer hooks help you build a store that stays fast and stable as it grows.



