Your store just hit 10,000 orders. Searching for one takes forever. Checkout feels sluggish. Sound familiar?
WooCommerce heard you. They rebuilt how orders are stored. They reimagined checkout from scratch.
But here's the thing. These aren't optional anymore.
HPOS is now the default. Block Checkout is the future. Plugins that don't support them? They're becoming dinosaurs.Let's break this down. No panic. Just preparation.
What is HPOS?
HPOS stands for High-Performance Order Storage.
Think of it this way:
WordPress stores everything in two tables. Posts and postmeta. Your blog posts? In there. Your pages? Same place. Your WooCommerce orders? Also crammed in there.
Now imagine 50,000 orders competing with 1,000 blog posts. Every database query becomes a treasure hunt.
HPOS fixes this.It gives orders their own dedicated tables:
| Table Name | What It Stores |
|---|---|
wp_wc_orders | Core order data (status, total, customer ID). |
wp_wc_order_addresses | Billing & shipping addresses. |
wp_wc_order_operational_data | Operational flags (stock reduced, email sent). |
wp_wc_orders_meta | Custom order metadata. |
What is Block Checkout?
The classic checkout was built on PHP shortcodes. It worked. But customization required code or plugins.
Block Checkout is built on React and the WordPress Block Editor.
What this means for you:- Drag-and-drop checkout customization.
- Faster page loads (JavaScript handles updates).
- Better mobile experience.
- Express payment buttons (Apple Pay, Google Pay) built-in.
- Real-time shipping calculations.
[woocommerce_checkout] shortcode still works. But new features? They're going to Block Checkout first.
Why should you care?
HPOS benefits
Block Checkout benefits
The catch
Plugin compatibility.Your favorite plugin might not work with HPOS. Or Block Checkout. Or both.
WooCommerce 10.x now checks this automatically. Incompatible plugins? You'll see a warning before enabling HPOS.
HPOS deep dive: what actually changes
The old way (Posts storage)
wp_posts
├── ID: 1234
├── post_type: 'shop_order'
├── post_status: 'wc-completed'
└── post_date: '2024-01-15'
wp_postmeta (hundreds of rows per order)
├── _billing_first_name: 'John'
├── _billing_last_name: 'Doe'
├── _billing_email: 'john@example.com'
├── _order_total: '99.99'
├── ... (50+ more meta fields)
Problem: One order = 1 post row + 50-100 meta rows. Queries join these tables constantly.
The new way (HPOS)
wp_wc_orders
├── id: 1234
├── status: 'wc-completed'
├── total_amount: 99.99
├── customer_id: 456
├── billing_email: 'john@example.com'
└── date_created_gmt: '2024-01-15'
wp_wc_order_addresses
├── order_id: 1234
├── address_type: 'billing'
├── first_name: 'John'
└── last_name: 'Doe'
Result: Core data in columns, not rows. Proper indexes. Lightning queries.
HPOS performance features
WooCommerce 10.x includes several performance optimizations:
| Feature | What It Does |
|---|---|
| Full-Text Search | Search orders by customer name, product, address. |
| Order Caching | Cache orders separately from WordPress object cache. |
| Optimized Indexes | Indexes on status, date, customer_id, billing_email. |
| Sync Mode | Run both systems in parallel during migration. |
Block Checkout: what's different
Classic Checkout components
- PHP templates.
- jQuery for validation.
- Separate AJAX requests for each action.
- Limited extensibility points.
Block Checkout components
The new checkout is modular:
| Block | Purpose |
|---|---|
| Contact Information | Email and phone fields. |
| Shipping Address | Address form with validation. |
| Billing Address | Separate or same as shipping. |
| Shipping Methods | Real-time rate calculation. |
| Payment Methods | All gateways in one block. |
| Express Payment | Apple Pay, Google Pay buttons. |
| Order Summary | Cart items, totals, coupons. |
| Order Note | Customer notes. |
| Terms & Conditions | Checkbox with link. |
Store API
Block Checkout uses the Store API. This is WooCommerce's REST API for cart and checkout.
Why does this matter?
Plugin compatibility: the truth
How WooCommerce tracks compatibility
Plugins can declare compatibility:
// Plugin declares HPOS compatibility
add_action( 'before_woocommerce_init', function() {
if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) {
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility(
'custom_order_tables',
__FILE__,
true // true = compatible, false = incompatible
);
}
});
Compatibility states
| State | What It Means |
|---|---|
| Compatible | Plugin works with HPOS. |
| Incompatible | Plugin breaks with HPOS. |
| Uncertain | Plugin hasn't declared (assumed incompatible). |
Common plugins and their status
Most major plugins now support HPOS:
Usually compatible:- WooCommerce Subscriptions.
- WooCommerce Memberships.
- WooCommerce Bookings.
- Stripe, PayPal gateways.
- Order tracking plugins.
- Custom order export tools.
- Older PDF invoice plugins.
- Legacy REST API integrations.
wp_posts queries.WP_Query for orders.- Legacy REST API (before WC 3.0).
How to check your plugins
- Look for the HPOS section.
- See the compatibility warnings.
wp wc hpos status
How to migrate safely
Step 1: Check compatibility
Before anything else:
# List all plugins and their HPOS compatibility
wp plugin list --fields=name,status
Then check each plugin's documentation.
Step 2: Enable sync mode first
Don't switch cold turkey. Use sync mode:
- Both databases stay updated.
- Old plugins still work (reading from posts).
- New queries use HPOS tables.
- You can switch back if needed.
Step 3: Test thoroughly
Critical tests:- Create a new order.
- Edit an existing order.
- Process a refund.
- Search for orders by customer email.
- Export orders to CSV.
- Check all order-related plugins.
- Verify webhooks fire correctly.
Step 4: Complete migration
Once confident:
- Disable sync mode.
- Keep HPOS as primary.
- Optionally clean up legacy data.
Speed up your store even more
HPOS helps. But there's more you can do.
Index WP MySQL For Speed
This plugin adds optimized indexes to WordPress tables.
What it does:wp_postmeta, wp_usermeta, etc.- Speeds up queries on large tables.
wp_wc_orders_meta.wp plugin install index-wp-mysql-for-speed --activate
wp index-mysql enable --all
Results: Some stores see 50%+ improvement in admin load times.
Get Index WP MySQL For Speed
Fast Woo Order Lookup
A lightweight plugin for faster order searches.
What it does:- Caches order search results.
- Optimizes "Orders" admin screen.
- Reduces database load.
Object caching
Use Redis or Memcached for persistent object caching:
Popular options:| Solution | Best For |
|---|---|
| Redis Object Cache | Most hosting providers. |
| Memcached | High-traffic sites. |
| SQLite Object Cache | Shared hosting without Redis. |
Query Monitor
Install Query Monitor to identify slow queries:
wp plugin install query-monitor --activate
Look for:
- Queries taking >0.1 seconds.
- Repeated queries (N+1 problem).
- Queries without indexes.
Additional optimizations
| Optimization | Impact |
|---|---|
| Disable heartbeat on admin | Reduces AJAX calls. |
| Limit post revisions | Smaller database. |
| Clean up transients | Faster wp_options. |
| Use autoload:no for options | Faster bootstrap. |
| CDN for static assets | Faster frontend. |
Block Checkout: migration tips
Check if you're already using it
// In your theme or plugin
if ( class_exists( 'Automattic\WooCommerce\Blocks\Package' ) ) {
// Blocks available
}
Or check your checkout page. Does it have the Block Editor? You're on Block Checkout.
Common issues and fixes
Issue: Custom fields not showingBlock Checkout uses the checkout fields API:
add_action(
'woocommerce_blocks_checkout_block_registration',
function( $integration_registry ) {
// Register your custom integration
}
);
Issue: Payment gateway not appearing
The gateway must support the Store API:
// Gateway must implement
\Automattic\WooCommerce\Blocks\Payments\Integrations\AbstractPaymentMethodType
Issue: Checkout hooks not firing
Classic hooks like woocommerce_before_checkout_form don't work. Use filters instead:
// Use the Block Checkout extensibility points
add_filter( 'woocommerce_blocks_checkout_...', 'your_function' );
Keeping classic checkout (for now)
Not ready to switch? You can use the Classic Shortcode block:
- Edit your checkout page.
- Delete all blocks.
- Add "Classic Shortcode" block.
- Select "Checkout".
Preparation checklist
Before enabling HPOS
- Backup your database.
- List all installed plugins.
- Check each plugin's HPOS compatibility.
- Test on staging first.
- Enable sync mode (not direct switch).
- Run order search tests.
- Verify order editing works.
- Check order exports.
- Test refunds and cancellations.
- Confirm webhooks function.
Before switching to Block Checkout
- Review current checkout customizations.
- Check payment gateway compatibility.
- Test all custom checkout fields.
- Verify email notifications.
- Test order confirmation page.
- Check mobile responsiveness.
- Confirm tracking pixels fire.
- Test express payment options.
FAQ
Is HPOS required now?
For new stores, yes - it's the default. Existing stores can still use posts storage, but it's deprecated.
Will I lose order data?
No. Migration copies data; it doesn't delete. Sync mode keeps both databases updated.
Can I switch back to posts storage?
Yes, if sync is enabled. Once you disable sync and clean up legacy data, switching back requires restoring from backup.
Do I need HPOS for Block Checkout?
No. They're independent features. But both together give the best performance.
What if a plugin isn't compatible?
- Check for plugin updates.
- Contact the developer.
- Use sync mode (both systems work).
- Consider alternatives.
How long does migration take?
Depends on order count:
| Orders | Approximate Time |
|---|---|
| 1,000 | Minutes. |
| 10,000 | 10-30 minutes. |
| 100,000 | Several hours. |
| 1,000,000+ | Use WP-CLI, scheduled. |
# For large stores
wp wc hpos sync --batch-size=500
Will Block Checkout affect my SEO?
No negative impact. Same URL, same content. Actually better because of faster load times.
Can I customize Block Checkout's appearance?
Yes. Use CSS, theme.json, or the Site Editor. Blocks support standard WordPress styling.
Timeline: what's coming
WooCommerce 10.x (Current)
- HPOS is default for new installs.
- Block Checkout is default.
- Sync mode available.
WooCommerce 11.x (Expected 2026)
- Possible deprecation of posts storage.
- More Block Checkout features.
- Enhanced Store API.
Beyond
- Posts storage removal (announced with long runway).
- Classic checkout maintenance mode.
- Full transition to modern architecture.
Action items (do this today)
The bottom line
HPOS and Block Checkout aren't just updates. They're WooCommerce's future.
The good news? The transition is smooth if you prepare.
- Start with sync mode.
- Test everything on staging.
- Update plugins proactively.
- Monitor performance gains.
_Have questions about HPOS or Block Checkout? Contact us or check out the WooCommerce documentation._


