Specialist service
WooCommerce HPOS support
High-Performance Order Storage moves orders out of the WordPress posts tables into dedicated order tables. Most problems come from code that still reads orders the old way. We audit, migrate, verify and fix — without risking order data.
Typical problems
HPOS problems we solve
Custom code reading wp_posts
get_post_meta(), WP_Query and direct SQL on orders return nothing after the switch.
Incompatible extensions
WooCommerce blocks enabling HPOS because active plugins have not declared compatibility.
Synchronisation that never finishes
Orders pending sync, sync running for days, or errors during the migration.
Data that differs between tables
Orders, meta or addresses that disagree between the posts tables and the order tables.
Missing orders in exports and reports
Exports, dashboards and integrations still querying the old tables.
Large stores
Migrating hundreds of thousands of orders without affecting a live store.
What an HPOS engagement covers
- Audit of custom code, the theme and extensions for direct order access
- Compatibility status of every active extension
- Rewriting incompatible code to the WooCommerce CRUD API (
wc_get_orders(),$order->get_meta()) - A migration plan using compatibility mode and synchronisation
- Verification of order data before and after switching
- A rollback path while synchronisation is still enabled
What you receive
- An audit report: what will break and why, with file and line references
- Fixed, HPOS-compatible code
- A migrated store with verified order data
- Documentation of what changed for future developers
How a safe HPOS migration works
- Audit. Search the theme, custom plugins and snippets for direct order access:
get_post_meta()orupdate_post_meta()on order ids,WP_Queryorget_posts()withshop_order, and SQL againstwp_postsorwp_postmetafor orders. - Fix the code so it uses the WooCommerce CRUD API, and declare HPOS compatibility in custom plugins.
- Enable compatibility mode so both storages are kept in sync, and let synchronisation finish.
- Verify that order data matches between storages, on staging first.
- Switch the authoritative storage to HPOS, keeping synchronisation on as a safety net.
- Disable synchronisation only after the store has run correctly for a while.
// Before: breaks once HPOS is authoritative
$po = get_post_meta( $order_id, '_po_number', true );
// After: works with both storages
$order = wc_get_order( $order_id );
$po = $order ? $order->get_meta( '_po_number' ) : '';Technical resources
HPOS guides
- WooCommerce / HPOS WooCommerce HPOS: problems, migration and custom code What HPOS changes, why custom code breaks, and how to migrate order storage safely.
- WooCommerce / Orders WooCommerce order problems Missing orders, wrong totals, statuses that never change, order data inconsistencies.
- WooCommerce / Integrations WooCommerce integration problems: REST API, webhooks and external systems REST API authentication, webhook deliveries, ERP/CRM syncs, timeouts and duplicated data.
FAQ
Frequently asked questions
Is HPOS enabled by default?
For new stores, yes — it has been the default since WooCommerce 8.2. Existing stores keep the legacy posts storage until they migrate.
Can we switch back if something goes wrong?
While compatibility mode keeps both storages synchronised, switching the authoritative storage back is possible. That is why synchronisation stays on until the store has run correctly on HPOS for a while.
Our code uses get_post_meta() on orders. Will it break?
Once HPOS is the authoritative storage, yes — it reads the posts tables, which are no longer the source of truth. Use the order object instead: wc_get_order( $id )->get_meta( 'key' ).
$ describe the problem
Have a WooCommerce problem?Request a diagnosis.
Tell us what is failing, what changed recently and the business impact. We review every request and recommend the appropriate next step.
Never send passwords, API keys or card data through the form.