WooCommerce / HPOS
HPOS en WooCommerce: problemas, migración y código a medida
High-Performance Order Storage (HPOS) traslada los pedidos de WooCommerce de las tablas de entradas de WordPress a tablas propias. Las tiendas ganan consultas de pedidos más rápidas; el código que lee los pedidos a la antigua deja de verlos.
Respuesta corta
HPOS guarda los pedidos en tablas propias como wp_wc_orders en lugar de wp_posts y wp_postmeta. El código que usa get_post_meta(), WP_Query o SQL directo sobre pedidos deja de funcionar cuando HPOS es el almacenamiento principal. Se arregla usando la API de pedidos de WooCommerce (wc_get_orders(), wc_get_order(), $order->get_meta()) y migrando con el modo de compatibilidad activado para que ambos almacenamientos sigan sincronizados.
Problemas concretos
Problemas de HPOS habituales
Código a medida que deja de ver los pedidos
get_post_meta(), WP_Query con shop_order y SQL sobre wp_posts.
Extensiones incompatibles
WooCommerce no deja activar HPOS mientras haya plugins incompatibles activos.
Migración y sincronización
Pedidos pendientes de sincronizar, migraciones lentas en tiendas grandes, errores durante la sincronización.
Diferencias de datos entre almacenamientos
Pedidos o meta que no coinciden entre las tablas de entradas y las tablas de pedidos.
Tablas de pedidos antiguas
Informes, exportaciones e integraciones que siguen leyendo las tablas antiguas.
Consultas directas a la base de datos
SQL en código a medida, herramientas de informes e integraciones externas.
Qué cambia con HPOS
Antes los pedidos eran entradas de WordPress de tipo shop_order, con sus datos repartidos entre wp_posts y wp_postmeta. Con HPOS, los pedidos viven en tablas propias (wp_wc_orders, wp_wc_orders_meta, wp_wc_order_addresses y wp_wc_order_operational_data) diseñadas para consultas de pedidos.
El código que usa la API de pedidos de WooCommerce sigue funcionando, porque la API lee el almacenamiento que sea el principal. El código que se la salta, no.
| Falla con HPOS | Funciona con ambos almacenamientos |
|---|---|
get_post_meta( $order_id, '_clave', true ) |
wc_get_order( $order_id )->get_meta( '_clave' ) |
update_post_meta( $order_id, … ) |
$order->update_meta_data( … ); $order->save(); |
new WP_Query( [ 'post_type' => 'shop_order' ] ) |
wc_get_orders( [ … ] ) |
SQL sobre wp_posts / wp_postmeta para pedidos |
Consultas de pedidos mediante la API |
El modo de compatibilidad es la red de seguridad
Con el modo de compatibilidad activado, WooCommerce mantiene sincronizadas las tablas de entradas y las tablas de pedidos. Eso permite una migración gradual: activar la sincronización, dejar que termine, verificar, cambiar el almacenamiento principal a HPOS y mantener la sincronización hasta estar seguro, para que siga siendo posible volver atrás.
Preguntas frecuentes
¿Qué es HPOS en WooCommerce?
High-Performance Order Storage: un sistema que guarda los pedidos en tablas propias de la base de datos en lugar de en las tablas genéricas de entradas y meta de WordPress. Es la opción por defecto en las tiendas nuevas desde WooCommerce 8.2.
¿Cómo sé si mi tienda usa HPOS?
Ve a WooCommerce → Ajustes → Avanzado → Características. Ahí se indica qué almacenamiento de pedidos es el principal y si el modo de compatibilidad (sincronización) está activado.
¿Por qué get_post_meta() no devuelve nada en los pedidos?
Porque con HPOS como almacenamiento principal, los datos del pedido están en las tablas de pedidos, no en wp_postmeta. Léelos a través del objeto del pedido: wc_get_order( $id )->get_meta( 'clave' ).
$ describe el problema
¿Tienes un problema con WooCommerce?Solicita un diagnóstico.
Cuéntanos qué falla, qué ha cambiado últimamente y cómo afecta al negocio. Revisamos cada solicitud y te recomendamos el siguiente paso.
Nunca envíes contraseñas, claves API ni datos de tarjetas a través del formulario.