WordPress Performance FAQ
My WooCommerce store uses many marketing, shipping, tax, payment, analytics, and integration plugins. I need these plugins for different parts of the store, so I cannot simply remove them globally.
How can I keep checkout fast without deleting plugins from the site?
Is the right question not only which plugins are installed, but which plugins, hooks, services, API calls, and PHP code actually need to participate in the checkout request itself?
Yes. In many WooCommerce stores, the more important question is:
"What code executes during a checkout request?" rather than "How many plugins are installed?"
A store can have 80 plugins installed and still have a fast checkout if only the necessary code paths execute during checkout. Conversely, a store with 20 plugins can have a slow checkout if several of them perform expensive work on every checkout request.
Think in terms of request participation
Every checkout request can trigger:
- Plugin bootstrapping
- WordPress hooks and filters
- WooCommerce hooks
- Database queries
- External API calls
- Session access
- Cart calculations
- Shipping calculations
- Tax calculations
- Payment gateway initialization
- Analytics and tracking code
- Third-party integrations
The performance question becomes:
Which of these actually need to run while the customer is waiting for checkout to load or complete?
Categorize plugins by checkout necessity
Must participate
These generally need to run during checkout:
- Payment gateways
- Shipping methods
- Tax engines
- Fraud detection
- Cart and pricing rules
- Checkout field customizations
- Subscription or membership logic affecting orders
Examples:
- Stripe
- PayPal
- TaxJar / Avalara
- WooCommerce Subscriptions
- Dynamic pricing plugins
Usually do not need full participation
Many plugins provide value elsewhere but don't need heavy processing during checkout:
- SEO plugins
- Marketing automation
- CRM sync
- Email marketing
- Affiliate tracking
- Analytics
- Feed generators
- Search plugins
- Product import/export tools
- Reporting systems
Examples:
- Mailchimp sync
- HubSpot
- Klaviyo
- Meta feed plugins
- Google Analytics integrations
- Product feed generators
These often still load code because WordPress loads all active plugins.
The real bottleneck: hooks
The largest checkout slowdowns often come from hooks such as:
woocommerce_before_calculate_totals
woocommerce_cart_calculate_fees
woocommerce_checkout_process
woocommerce_checkout_update_order_review
woocommerce_after_checkout_validation
A plugin may be installed for marketing purposes, but if it attaches expensive logic to one of these hooks, checkout becomes slower.
For example:
add_action(
'woocommerce_checkout_process',
'expensive_remote_validation'
);
If that function calls an external API:
wp_remote_post(...)
every checkout now waits on that service.
External APIs are often the worst offenders
Checkout latency is frequently caused by:
- Real-time tax APIs
- Shipping rate APIs
- CRM APIs
- Fraud APIs
- ERP integrations
- Inventory synchronization
A single API call can add:
- 300ms
- 800ms
- 2 seconds
- More if retries occur
Five plugins each adding 500ms means checkout is already 2.5 seconds slower.
When profiling WooCommerce stores, external requests are often more expensive than PHP execution itself.
Delay work until after checkout
A common optimization is:
Bad
Checkout
└── Create order
└── Sync CRM
└── Sync ERP
└── Send marketing event
└── Update analytics
Customer waits for everything.
Better
Checkout
└── Create order
└── Queue background jobs
Background workers
└── CRM sync
└── ERP sync
└── Analytics
└── Marketing automation
The customer gets an immediate response while integrations run asynchronously.
This can be done with:
- Action Scheduler
- WP Cron (less ideal)
- External queues
- Webhook-based architectures
WooCommerce already includes Action Scheduler and many high-quality plugins use it.
Measure actual execution
Rather than guessing, profile checkout requests.
Useful tools:
- Query Monitor
- New Relic
- Blackfire
- Tideways
- Xdebug profiler
Look for:
- Slow hooks
- Slow callbacks
- Slow database queries
- Excessive object creation
- External HTTP requests
A profile often reveals something like:
Checkout Request
Stripe Gateway 120ms
Tax Plugin 300ms
Shipping API 850ms
CRM Sync 1200ms
Marketing Plugin 700ms
The plugin count isn't the issue. The checkout execution path is.
Advanced approach: conditional loading
Some large WooCommerce stores selectively disable plugin functionality on checkout pages.
For example:
if ( is_checkout() ) {
remove_action(...);
}
or
if ( is_checkout() ) {
return;
}
inside custom integrations.
This requires careful testing because many plugins assume their hooks are available.
The safest approach is usually:
- Profile checkout.
- Identify expensive hooks.
- Move non-essential work to background jobs.
- Cache where possible.
- Eliminate unnecessary API calls.
- Only then consider conditional loading.
A useful mental model
Think of checkout as a critical transaction pipeline:
Customer clicks "Place Order"
Required:
✓ Payment
✓ Tax
✓ Shipping
✓ Order creation
Optional:
✗ CRM updates
✗ Analytics updates
✗ Marketing sync
✗ Feed generation
✗ Reporting
✗ Search indexing
✗ ERP synchronization
Everything in the second group should ideally happen after the order is safely created and paid.
So your intuition is correct: the key optimization question is not "Which plugins are installed?" but "Which plugins, hooks, services, database queries, and API calls are participating in the checkout request path, and which of those are truly required before the customer receives a response?" That's the perspective used by high-performance WooCommerce stores handling significant checkout volume.
That makes sense. Moving CRM, ERP, analytics, and marketing sync into background jobs can reduce checkout waiting time, because the customer no longer waits for work that can happen later.
But what about plugins or subsystems that are not needed for checkout at all?
If a marketing plugin, feed generator, search plugin, form builder, popup system, or reporting tool is not required to calculate cart totals, shipping, tax, payment, fraud checks, or order creation, then delaying its work is only one option. A deeper question would be whether it should enter the checkout request lifecycle at all.
Also, if the decision is made with is_checkout() after WordPress has already loaded active plugins, then some bootstrap cost has already happened.
So should checkout performance distinguish between:
- necessary but delayable work that should move to background jobs,
- necessary synchronous checkout work that should be optimized,
- and unnecessary plugin/runtime participation that should be prevented before the plugin stack fully loads?
Would the third category require an earlier request-aware execution layer rather than ordinary late conditional logic?
Yes. What you're describing is a more mature performance model than the usual "disable plugins" advice.
Your three categories are a useful way to think about WooCommerce checkout optimization:
| Category | Should run during checkout? | Strategy |
|---|---|---|
| Necessary but not customer-blocking | No | Move to background jobs |
| Necessary and customer-blocking | Yes | Optimize heavily |
| Not needed for checkout at all | No | Prevent participation |
The third category is where many WooCommerce stores leave significant performance gains on the table.
The hidden cost of "installed but inactive for checkout"
Many developers think:
if ( is_checkout() ) {
return;
}
solves the problem.
But by the time that code executes:
- WordPress has loaded the plugin file
- PHP has parsed the plugin code
- Service containers may be built
- Classes may be autoloaded
- Dependency injection may be initialize
- Hooks may already be registered
- Configuration may already be loaded
The plugin has already participated in the request.
You may have prevented some business logic, but not the bootstrap cost.
For lightweight plugins this is negligible.
For enterprise-style plugins with:
- large autoload trees
- SDKs
- API clients
- ORM layers
- service containers
bootstrap alone can be substantial.
Checkout should be treated as a specialized runtime
Most WordPress sites effectively operate as:
Request
↓
Load all plugins
↓
Decide what is needed
A performance-focused architecture inverts this:
Request
↓
Identify request type
↓
Load only required subsystems
↓
Execute request
This is how many high-performance application frameworks think about execution.
The checkout request becomes a specialized workload.
A checkout request has a narrow dependency graph
Conceptually checkout only requires:
WordPress Core
WooCommerce Core
Cart
Session
Customer
Order
Shipping
Tax
Payment
Fraud
Inventory
Potentially:
Subscriptions
Memberships
Pricing Rules
Everything else is suspect until proven necessary.
For example:
SEO
Search
Forms
Popups
Page Builders
Feeds
Analytics
CRM
Reporting
Affiliate Systems
should not automatically be assumed to belong in the checkout dependency graph.
The biggest gains often come before hooks execute
Consider two stores.
Store A
100 plugins installed.
Every request:
Load 100 plugins
Register 10,000 hooks
Initialize services
Build containers
Checkout begins
Store B
100 plugins installed.
Checkout request:
Load 25 plugins
Register 2,000 hooks
Checkout begins
Even if both stores perform identical checkout calculations, Store B often wins because the request enters checkout with less memory, fewer objects, fewer hooks, and less bootstrap overhead.
This requires earlier request awareness
You're identifying the key architectural issue.
is_checkout() is typically too late.
An earlier decision point would occur before most plugin initialization.
Conceptually:
Incoming Request
↓
Classify Request
↓
Checkout
↓
Load Checkout Runtime
instead of:
Incoming Request
↓
Load Entire Site Runtime
↓
Discover It's Checkout
The second model is how most WordPress sites operate.
The first model is closer to application-level optimization.
Practical implementations
People achieve this in various ways.
1. Selective plugin loading
Some systems intercept active plugins before WordPress loads them.
Conceptually:
Checkout request
Load:
- WooCommerce
- Stripe
- Tax
- Shipping
Do not load:
- Feed plugin
- Reporting plugin
- Popup plugin
- Search plugin
This attacks bootstrap cost directly.
The challenge is dependency management.
Plugins often assume other plugins exist.
2. Modular architecture
Instead of:
One giant plugin
you get:
Core
Marketing Module
Analytics Module
ERP Module
Feed Module
Only required modules initialize.
This is common in custom WooCommerce platforms.
3. Service-level lazy loading
Rather than loading everything at startup:
new CRMService();
new AnalyticsService();
new FeedGenerator();
services are instantiated only when requested.
This reduces bootstrap overhead even when the plugin remains active.
An even more useful model
When profiling checkout, classify everything into four buckets:
Required synchronously
Customer waits.
Examples:
- payment authorization
- tax calculation
- shipping calculation
- inventory reservation
Required asynchronously
Must happen eventually.
Examples:
- CRM sync
- ERP sync
- marketing events
Optional during checkout
Can happen later or elsewhere.
Examples:
- analytics enrichment
- recommendation updates
- feed updates
Irrelevant to checkout
Should never enter the runtime.
Examples:
- page builders
- popup systems
- reporting engines
- SEO analysis
- product importers
- feed generators
The fourth bucket is where early request-aware loading becomes valuable.
The architectural principle
A useful way to state it is:
Checkout optimization is not only about making checkout code faster. It is about reducing the amount of non-checkout code that is allowed to exist in the checkout process.
Once you view checkout as a dedicated execution environment rather than just another WordPress page, the question shifts from:
"Which plugins are installed?"
to:
"What is the minimum set of code, hooks, services, and dependencies required to safely complete an order?"
Everything outside that boundary is either:
- optimized,
- deferred,
- lazily loaded,
- or excluded from the checkout runtime entirely.
That is typically where the largest scaling gains appear on complex WooCommerce stores.
This is exactly where LiteCache Rush applies its principle of Performance by Prevention. A WooCommerce store may need many marketing, shipping, tax, payment, analytics, and integration plugins globally, but checkout should not automatically carry the full site runtime. Payment, shipping, tax, cart, fraud, inventory, and order logic may genuinely belong in the synchronous checkout path. CRM sync, analytics, ERP updates, reporting, feeds, popups, page-builder modules, and unrelated marketing systems often do not. Rush targets this earlier layer: it identifies the checkout/request context before the full plugin stack is loaded and prevents unrelated PHP and plugin execution from entering the checkout runtime in the first place. The goal is not to remove plugins from the store, but to stop non-checkout code from participating in checkout.