Back to Blog
December 15, 2025·
Themology
·
11 min read

HPOS and Block Checkout: What Store Owners Need to Care About?

WooCommerce rebuilt how orders are stored and reimagined checkout from scratch. Here's what you need to know about HPOS and Block Checkout.
WooCommerceHPOSBlock CheckoutPerformanceTutorial
HPOS and Block Checkout: What Store Owners Need to Care About?

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 NameWhat It Stores
wp_wc_ordersCore order data (status, total, customer ID).
wp_wc_order_addressesBilling & shipping addresses.
wp_wc_order_operational_dataOperational flags (stock reduced, email sent).
wp_wc_orders_metaCustom order metadata.
Four tables. Purpose-built. Properly indexed. Result? Order queries that used to take 3 seconds now take 0.1 seconds.

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.
The classic [woocommerce_checkout] shortcode still works. But new features? They're going to Block Checkout first.

Why should you care?

HPOS benefits

  • Speed: Stores with 100K+ orders see dramatic improvements.
  • Scalability: Database doesn't choke as you grow.
  • Full-Text Search: Find orders by product name instantly.
  • Better Caching: Orders cached separately from posts.
  • Future Features: New WooCommerce features require HPOS.
  • Block Checkout benefits

  • Customization: Edit checkout like any WordPress page.
  • Performance: Single-page app feel.
  • Extensions: Payment gateways integrate via Store API.
  • Accessibility: Built with a11y in mind.
  • Local Pickup: Native support for store pickup.
  • 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:

    FeatureWhat It Does
    Full-Text SearchSearch orders by customer name, product, address.
    Order CachingCache orders separately from WordPress object cache.
    Optimized IndexesIndexes on status, date, customer_id, billing_email.
    Sync ModeRun 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:

    BlockPurpose
    Contact InformationEmail and phone fields.
    Shipping AddressAddress form with validation.
    Billing AddressSeparate or same as shipping.
    Shipping MethodsReal-time rate calculation.
    Payment MethodsAll gateways in one block.
    Express PaymentApple Pay, Google Pay buttons.
    Order SummaryCart items, totals, coupons.
    Order NoteCustomer notes.
    Terms & ConditionsCheckbox with link.
    Each block is customizable. Move them. Hide them. Style them.

    Store API

    Block Checkout uses the Store API. This is WooCommerce's REST API for cart and checkout.

    Why does this matter?

  • Headless Commerce: Build custom frontends.
  • Mobile Apps: Same API, native apps.
  • Performance: Efficient JSON responses.
  • Security: Built-in rate limiting and validation.

  • 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

    StateWhat It Means
    CompatiblePlugin works with HPOS.
    IncompatiblePlugin breaks with HPOS.
    UncertainPlugin 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.
    Check first:
    • Order tracking plugins.
    • Custom order export tools.
    • Older PDF invoice plugins.
    • Legacy REST API integrations.
    Known issues:
  • Plugins using direct wp_posts queries.
  • Plugins using WP_Query for orders.
    • Legacy REST API (before WC 3.0).

    How to check your plugins

  • Go to WooCommerce → Settings → Advanced → Features.
    • Look for the HPOS section.
    • See the compatibility warnings.
    Or use WP-CLI:
    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:

  • Go to WooCommerce → Settings → Advanced → Features.
  • Enable HPOS with sync enabled.
    • Both databases stay updated.
    This means:
    • 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:
  • Adds high-performance indexes to wp_postmeta, wp_usermeta, etc.
    • Speeds up queries on large tables.
  • Includes WooCommerce-specific indexes for wp_wc_orders_meta.
  • Installation:
    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.
    Get Fast Woo Order Lookup

    Object caching

    Use Redis or Memcached for persistent object caching:

    Popular options:
    SolutionBest For
    Redis Object CacheMost hosting providers.
    MemcachedHigh-traffic sites.
    SQLite Object CacheShared 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

    OptimizationImpact
    Disable heartbeat on adminReduces AJAX calls.
    Limit post revisionsSmaller database.
    Clean up transientsFaster wp_options.
    Use autoload:no for optionsFaster bootstrap.
    CDN for static assetsFaster 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 showing

    Block 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".
    This keeps the old PHP checkout running.

    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:

    OrdersApproximate Time
    1,000Minutes.
    10,00010-30 minutes.
    100,000Several 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)

  • Check your WooCommerce version: Update to 10.x.
  • Review plugin compatibility: Note any warnings.
  • Set up staging site: Test changes safely.
  • Enable HPOS with sync: Start the transition.
  • Install performance plugins: Index WP MySQL, Object Cache.
  • Test Block Checkout: On staging first.
  • Update incompatible plugins: Or find alternatives.
  • Monitor performance: Before and after metrics.

  • 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.
    Your 10,000-order store? It's about to feel like a fresh install. Don't panic. Prepare.

    _Have questions about HPOS or Block Checkout? Contact us or check out the WooCommerce documentation._