High-Performance Order Storage o Almacenamiento de pedidos de alto rendimiento (HPOS) es una nueva característica de WooCommerce, desarrollada para aumentar el rendimiento del plugin, utilizando tablas personalizadas en la base de datos de WordPress.
Y si crees que esto no va contigo, que puedes sencillamente ignorarlo hasta que llegue, te equivocas: si para agosto no has migrado a la nueva estructura, puedes tener serios problemas en tu tienda. Pero no hay por qué asustarse si se hacen las cosas bien y con tiempo. Vamos a repasar todo lo que necesitas saber para que no te pille el cambio a contrapié.
Tabla de contenidos
Qué es High-Performance Order Storage (HPOS)
Si te has fijado en la sección de ajustes avanzados de WooCommerce desde la versión 7.1, habrás notado una nueva características de almacenamiento de pedidos de alto rendimiento. Y claro, sabiendo que una mejora en la velocidad de la tienda significa un aumento de las ventas, eso de «alto rendimiento» seguro que te ha llamado la atención. ¿Pero qué es eso exactamente?
Yendo al grano, es un cambio en la estructura de datos de WooCommerce en la base de datos de WordPress. Con HPOS, WooCommerce deja de utilizar las tablas wp_posts y wp_postmeta para guardar los datos de los pedidos (algo que se le venía pidiendo ya desde hace bastante tiempo) y pasa a utilizar tablas personalizadas, esto es, tablas propias dentro de la base de datos de WordPress: wp_wc_orders, wp_wc_orders_meta y wp_wc_order_addresses.
¿Y qué conlleva este cambio? Pues básicamente una mejor organización de los datos, lo que conlleva una mayor eficiencia en la búsqueda, acceso y modificación de los mismos. En pocas palabras, una tienda más rápida, algo que será apreciable especialmente en aquellos comercios con cientos o miles de productos.
Para cuándo se espera HPOS en WooCommerce
Si te fijas, de momento es una característica en desarrollo, y que se puede probar de forma experimental. De hecho, el mensaje que aparece sobre ella (Estas características son experimentales o están incompletas. ¡Actívalas bajo tu responsabilidad!) debería ponerte sobre aviso.
Pero no te equivoques: la migración a HPOS requerirá una reescritura en la base de datos de todos los pedidos existentes y sus datos asociados, así que no es algo que debamos «dejar para mañana». Antes de que dicha característica sea parte definitiva del núcleo de WooCommerce, deberíamos haber migrado nosotros de forma controlada, asegurándonos de que no va a explotar todo.
Y la fecha no es tan remota: HPOS será la opción por defecto a partir de WooCommerce 8.0, que se espera se publique el día 8 de agosto. Si para entonces no lo has preparado todo tienes dos opciones:
- No actualizar a WooCommerce 8 (recomendable durante unos días, pero no válido como solución a medio o largo plazo) o
- Cerrar los ojos, actualizar, y que sea lo que tenga que ser (o sea, jugártela al azar).
Como ves, aunque siempre es mejor que esperes unos días antes de actualizar a WooCommerce 8 cuando esta versión se publique (para que los early adopters reporten los fallos que tenga la versión y estos se solucionen), deberías para entonces estar preparado y haber probado (y migrado ya a) HPOS.
Veamos cómo hacerlo correctamente.
Cómo migrar a HPOS sin que nos explote la tienda en las manos
Veamos cómo realizar la migración correctamente desde la estructura de datos antigua (con los datos de los pedidos en las tablas de entradas de WordPress) a la nueva (con los datos de los pedidos en las tablas específicas de WooCommerce).
Encontrarás la opción correspondiente en WooCommerce > Ajustes > Características > Características experimentales > Almacenamiento de pedidos de alto rendimiento.
Atención: Ante todo (por si has saltado directamente a esta sección) repito: si en la opción correspondiente WooCommerce te está mostrando el texto ADVERTENCIA: Esta característica está en desarrollo y puede causar inestabilidad en la base de datos. Solo para colaboradores., es que aún NO es el momento de realizar la migración.
Antes de migrar tu WooCommerce a HPOS
Ante de tocar nada, tendremos que hacer algunos preparativos. Y creo que puedo empezar diciendo que, lo hagas cuando lo hagas, deberías hacerlo primero en una instalación de prueba en la que hayas duplicado tu tienda. Los problemas siempre son menos problemas cuando no nos estamos cargando nuestro negocio (o el de un cliente). Si aún no tienes una instalación espejo de la tienda (un «duplicado»), quizá este sería un buen momento para crearlo.
Dicho esto, por supuesto el primer paso es realizar una copia de seguridad completa del sitio. Y con esto aún no hemos terminado de preparar el terreno, porque esta vez hay más: al cambiar la estructura de datos, es necesario que todos los plugins que utilicemos se hayan adaptado a este cambio.
Compatibilidad de tus plugins con HPOS
Asegúrate de tener todos los plugins actualizados, en especial aquellos cuya funcionalidad está directamente relacionada con la tienda. De hecho, si tienes plugins que estén declarando compatibilidad con WooCommerce pero que no declaren específicamente que son compatibles con HPOS, directamente la opción estará deshabilitada y no podrás activar HPOS.
Como puedes ver en la imagen, WooCommerce te ofrece un enlace mediante el que gestionar los plugins incompatibles con HPOS (Gestionar plugins incompatibles). En ese enlace podrás ver cuáles son y, si así lo consideras, desactivarlos.
Por cierto, que no sería mala idea ir echando ya un vistazo a eso y contactar con los desarrolladores de los plugins que estés usando y no sean compatibles. Si usas alguno de mis plugins, decirte que ya trabajo en la compatibilidad para todos ellos y que decididamente estarán todos preparados para cuando llegue la publicación definitiva de HPOS (agosto de 2023).
Renovaciones de suscripciones durante el cambio a HPOS
Si tienes algún producto o servicio de suscripción o pago recurrente en tu tienda, no está de más que antes de empezar compruebes si se espera alguna renovación en los próximos minutos/horas.
Ten en cuenta que se trata de generar nuevas tablas con los datos de los pedidos existentes, y la generación de nuevos pedidos puede estar bloqueada durante el proceso o pueden perderse datos si estos se actualizan antes de que se complete la migración.
Si usas WooCommerce Subscriptions, puedes ir a WooCommerce > Subscripciones, pinchar en las que están en estado Activas, y ordenarlas en orden creciente según la columna Siguiente pago. Así puedes ver si se va a producir alguna renovación de suscripción próximamente.
¿Estás construyendo tu tienda online o eres implementador WordPress?
¿Necesitas plugins de calidad y con soporte para implementar funcionalidades concretas?
Consigue todos los plugins a la venta en la sección de plugins de esta web y todos los que siga añadiendo. Acceso a los 96 plugins (y subiendo) con soporte directo del desarrollador, actualizaciones y uso ilimitado: úsalos en tantas webs como lo necesites.
El cambio a HPOS
Una vez realizada copia de seguridad completa del sitio web y verificado que todos nuestros plugins son compatibles con HPOS, es el momento de ponernos manos a la obra. Marcamos la opción Activa la característica de almacenamiento de pedidos de alto rendimiento y guardamos los cambios.
Nos aparece entonces una nueva sección en WooCommerce > Ajustes > Características > Almacenes de datos personalizados, con varias opciones aunque, de momento, no las puedes seleccionar, a no ser que en tu tienda no haya ningún pedido, en cuyo caso te ahorras la migración.
Opciones de los almacenes de datos personalizados
Las opciones que encuentras son:
- Almacén de datos para pedidos:
- Usa las tablas de pedidos de WooCommerce.
- Usa la tabla de entradas de WordPress (seleccionada por defecto).
- Mantener sincronizadas la tabla de entradas y las de pedidos.
- Usa transacciones de la base de datos para la sincronización de los datos de los pedidos.
- Nivel de aislamiento de transacción de la base de datos a usar (selector desplegable):
- REPEATABLE READ
- READ COMMITTED
- READ UNCOMMITTED
- SERIALIZABLE
Como lo normal es que ya tengas algún pedido, la opción Almacén de datos para pedidos no será modificable hasta que la migración haya terminado (te informa de cuántos pedidos quedan para completar la actualización de la base de datos). Dicha sincronización comienza cuando marques la opción Mantener sincronizadas la tabla de entradas y las de pedidos y guardes.
Niveles de aislamiento de los datos
Esta opción del selector puede ser la más delicada. Básicamente lo que te pregunta aquí es cuánta seguridad frente a errores quieres a la hora de crear las nuevas tablas. Obviamente, un mayor nivel de protección conlleva una migración más larga y con mayor carga para el servidor, además de mantener bloqueada la creación de pedidos durante las operaciones.
Así que elegir una opción u otra dependerá de varios factores como la capacidad del servidor, el número de pedidos que tiene la tienda, la posibilidad de que se generen automáticamente pedidos de renovación de suscripción durante el tiempo que dura la migración (si tienes suscripciones) y la disponibilidad para que los usuarios realicen pedidos mientras se realiza la migración.
Las opciones disponibles:
- READ UNCOMMITTED (lectura no confirmada): La lectura se lleva a cabo sin bloqueo, pero al no haber aislamiento no se puede garantizar que los datos no hayan cambiado tras la lectura, y puede dar lugar a lecturas no consistentes («lectura sucia»). Rápido y poco recomendable.
- READ COMMITTED (lectura confirmada): Se realizan bloqueos compartidos de datos entre dos operaciones, con lo que se evitan las lecturas sucias, pero el bloqueo se acaba con la lectura, por lo que posteriormente a ésta se puede producir un cambio en los datos que no será tenido en cuenta.
- REPEATABLE READ (lectura repetible): Lee todos los datos de forma coherente, sacando una especie de «instantánea» de los datos a transferir, evitando cambios inesperados. Esta es la opción más recomendable en la mayoría de los casos.
- SERIALIZABLE: Bloquea todos los datos, garantizando que no habrá ni la más mínima inconsistencia tras la migración. Es el modo más seguro pero bloqueará el proceso de pedidos. Dependiendo de la frecuencia de pedidos en tu tienda te puede interesar esta opción.
Cambio definitivo a HPOS
Mientras la migración está en curso (puede llevar desde unos minutos a bastante tiempo, en función de la cantidad de pedidos que tenga la tienda) aparece una opción que permitirá que la característica se active una vez terminada la sincronización: Al finalizar la sincronización, pasa a utilizar la tabla de pedidos como almacén de datos autorizado para pedidos..
Si activas esta opción, el uso de las tablas de WooCommerce es activará automáticamente una vez que la migración se haya completado. Si no, tendrás que esperar a que termine (o volver después) y activarla manualmente, ya que una vez terminada la actualización de la base de datos ya tendrás la opción disponible:
A partir de este momento tenemos disponibles las dos opciones:
- Usa las tablas de pedidos de WooCommerce: Esta es la nueva funcionalidad HPOS. WooCommerce usa para guardar y recuperar los datos de los pedidos las tablas personalizadas wc_orders, wc_orders_meta, wc_order_addresses y wc_order_operational_data. Este será el modo de trabajo por defecto de WooCommerce a partir de la versión 8.0.
- Usa la tabla de entradas de WordPress. Como hasta ahora, usando wp_posts y wp_postmeta para guardar los datos de los pedidos. Sólo para usar si, a pesar de todo, algo ha ido mal. Esta opción desaparecerá pronto, así que no tiene sentido que la dejes seleccionada si todo ha funcionado correctamente.
Aún así, si las circunstancias lo piden, puedes cambiar entre una y otra para hacer comprobaciones (por ejemplo, si algún plugin no funciona correctamente) siempre que mantengas activada la opción Mantener sincronizadas la tabla de entradas y las de pedidos, de esta forma se actualizan ambos sets de tablas al modificar/crear/eliminar pedidos.
Aunque esto significa acceder doblemente a la base de datos, así que es recomendable sólo hasta comprobar que todo funciona adecuadamente. Después hay que dejarlo todo en Usa las tablas de pedidos de WooCommerce, que será como funcione WooCommerce en la sucesivo.
Tito whisky dice
Hola, muy buena la explicación y me parece acertado que WC comience a utilizar tablas propias. En cuanto a la compatibilidad con otros plug-ins es prueba y error, pero esta el tema de las mejoras que uno puede tener por afuera es decir codificación php en la cual se utilizan comandos o instrucciones que no serían propias de WC sino de WP para obtener información sobre los pedidos por lo que me interesa saber si hay una lista de que instrucciones de WP hay que remplazar y por cuales. Por ejemplo utilizo update_post_meta para agregar datos adicionales a los pedidos, como ser el link de seguimiento de un envío entre otros datos adicionales, como esa función actúa sobre la tabla post_meta entiendo que deberá cambiarla por otra que me permita trabajar sobre la tabla asociada de WC. En esta publicación: https://github.com/woocommerce/woocommerce/wiki/High-Performance-Order-Storage-Upgrade-Recipe-Book hay algunos ejemplos en el caso del update_post_meta( $post_id, $meta_key_1, $meta_value_1 ); hay que remplazar por:
$order = wc_get_order( $post_id );
$order->update_meta_data( $meta_key_1, $meta_value_1 );
$order->save();
El tema es y el resto de los comandos, porque y como los remplazamos?
Busque pero no encuentro una lista completa de los nuevos comandos de WC que se estan implementado, como el update_meta_data (que dicho sea de paso porque no le pusieron wc_update_meta_data así se identifica claramente que es de wc?). Gracias.
Enrique J. Ros dice
Hola Tito whisky
No hay una lista como tal, o yo no la conozco; lo que WooCommerce ha publicado es el texto que enlazas y es lo que estamos usando todos. En general, esas instrucciones son suficientes. Se trata de no acceder a wp_posts ni wp_postmeta para recuperar ni actualizar datos de pedidos, y hacerlo todo a través de las nuevas tablas. Tienes que realizar un repaso completo de tu código y cambiar todas las instrucciones que lo hagan, simplemente. Después, migrar a HPOS la instalación de prueba y testarlo todo.
Un saludo y suerte
P.S. Sí, tienes razón, podían haber creado un alias para update_meta
Armando dice
Buen día, hice el proceso, pero no se migraron los pedidos que ya tenía, son más de mil.
y al generar un pedido manual sale error critico en la Web, y si se hace normal como un usuario no lo deja hacer.
Sabes que podría hacer en este caso?
Fernando Gallardo dice
yo tengo el mismo problema, como utilizo suscripciones, al dar de alta una suscripcion, no solo no genera el pedido, si no que tampoco me crea la cuenta de usuario, con lo que tengo que generar un pedido manualmente y me sale lo del error crítico
Pablo dice
Muchas gracias por el artículo. Una duda que me surge, ¿solo los plugins pueden dar problemas de compatibilidad o la plantilla que estés usando puede presentar también errores? Yo uso una plantilla bastante antigua y estoy mirando de renovarla aprovechando la llegada del HPOS
Enrique J. Ros dice
Hola Pablo
En principio la plantilla no debería contener funciones, los temas se ocupan sólo del aspecto del diseño/estilos. Sin embargo, muchas plantillas incluyen sus propias funciones para WooCommerce (funcionalidades que se empeñan en incluir para intentar destacar en la feroz competencia que hay entre temas). Si ése es el caso, puede efectivamente no ser compatible.
Un saludo,
Lucas dice
Muy útil, habrá k ponerlo en práctica!
Tomás dice
Gracias Enrique por tus aportaciones.
Tengo una duda, recientemente activé HPOS en mi tienda, dado que 1 plugin me lo impedia, hasta que el desarrollador actualizó.
Ahora, mi base de datos de 400 y pico MB ha pasado a 700 y pico. Entiendo que ha sido por las nuevas tablas que ha creado Woocommerce en la activación de HPOS.
La pregunta es, ¿debería eliminar las tablas antiguas en WP, en relación a los pedido?
Un plugin como Data Base Cleaner detectaría las tablas antiguas como huérfanas?
Gracias de antemano.