Available for projects & agency overflow · Quick reply, from the person who does the work

Enabling high-performance order storage (HPOS) on WooCommerce

Since WooCommerce 8.2, released in October 2023, high-performance order storage (HPOS, also known as Custom Order Tables) is out of beta and declared stable. Shops created from 10 October 2023 onwards have it enabled by default; older shops need to enable it deliberately.

Describe my issue Send a message

What HPOS changes in order storage

Before HPOS, WooCommerce stored each order as a post in the wp_posts table (with a shop_order content type), with all its data (customer, amounts, status, address) as metadata scattered across wp_postmeta, a generic table shared with every other content type on the site. With HPOS, orders are stored in dedicated tables, structured specifically for order queries: searching, filtering by status, reporting.

It’s enabled under WooCommerce > Settings > Advanced > Features, on existing shops that don’t have it on by default. A sync mode keeps both structures aligned during the transition, which allows rolling back if a problem shows up.

Why an extension can stop working with HPOS

  • A payment, accounting or reporting extension that reads or writes directly to wp_posts or wp_postmeta instead of going through the WooCommerce CRUD API (get_post_meta(), WC_Order, and so on) keeps looking for data in the wrong place once HPOS is active: missing orders in reports, status not updated, incomplete accounting exports.
  • A theme or an in-house module that queries the database directly with SQL against wp_posts filtered on post_type = 'shop_order' no longer finds orders created after HPOS is enabled.
  • Some extensions explicitly declare HPOS compatibility in their plugin header; WooCommerce shows this in the plugin list (compatible, not compatible, or not declared), which lets you check before enabling rather than after an incident.

How I enable HPOS on an existing shop

  1. Checking extension compatibility

    I check the HPOS compatibility status WooCommerce shows for each active order-related extension (payment, invoicing, shipping, reporting), and update the ones that aren’t compatible yet.

  2. Enabling sync mode

    I enable HPOS with sync kept on: orders are written to the new tables and stay replicated in wp_posts, which leaves a way out if an extension misbehaves.

  3. Testing on a sample of orders

    I check order creation, status changes, refunds and exports for each active payment channel, on a test environment first.

  4. An observation period with sync active

    I keep the shop running with sync active long enough to cover a full order cycle, watching reports and sensitive extensions.

  5. Turning off the old storage

    Once stability is confirmed, I turn off sync and the old wp_posts storage. This is the point of no return: turning it off before being certain no extension still depends on wp_posts for orders risks a silent loss of compatibility.

Going further

Describe your need in one minute

A few targeted questions so I can reply with an estimate rather than another questionnaire.

origine
catalogue
extensions-premium (facultatif)
conserver (facultatif)
Please provide an email or a phone number so I can get back to you.

Please provide an email or a phone number so I can get back to you.

Frequently asked questions

Will HPOS change my existing orders?
No, enabling it with sync copies existing orders into the new tables without altering them. Order history stays intact and browsable as normal.
Can I roll back after enabling HPOS?
Yes, as long as sync and the old wp_posts storage haven’t been switched off. That’s exactly the point of keeping sync active for a while before cutting over the old system.
How do I know if my payment extensions are compatible?
WooCommerce shows the HPOS compatibility status each extension declares in the active plugin list. I check this before enabling anything in production.
Is HPOS mandatory?
It’s on by default for shops created from 10 October 2023 onwards. On an older shop, enabling it stays optional, but it brings a real performance gain on order queries as the order catalogue grows.
How long should sync stay active before turning off the old storage?
Long enough to cover an order cycle representative of the shop’s activity, including the less-used extensions (refunds, month-end accounting exports) to make sure they still work correctly.