Hace poco hemos liberado dos actualizaciones que aparte de hacer compatibles nuestros plugins para RedSys y WooCommerce y Ceca y WooCommerce con HPOS, declaran de forma explícita la compatibilidad.
Así que bueno, antes de nada empecemos por explicar qué es HPOS.
Desde sus inicios, WooCommerce usaba las tablas post y postmeta, como cualquier otro tipo de dato personalizado de WordPress, para guardar los pedidos. Es cierto que toda la información de los pedidos no estaba aquí porque hay tablas aparte como woocommerce_order_items y woocommerce_order_itemmeta, pero todo lo relativo al pedido como tal, se guardaba en la estructura estándar.
Este diseño tenía un problema de concepto en sí mismo ya que al mezclar ahí todos los datos, la consulta, acceso, actualización, borrado… era más lento que si tuvieran tablas propias.
En una tienda no demasiado grande esos problemas no llegan a ser graves no se nota pero claro, en tiendas relativamente grandes, cuando hay muchos pedidos la tabla post se llenaba pero la postmeta lo hacía incluso más, comprometiendo no solo la velocidad sino hasta la estabilidad del servicio.
¿Por qué? Pues porque en postmeta se guarda todo lo que no cabe en post: nombre y apellidos del cliente, dirección de envío y de facturación que son unos pocos datos en sí mismos (dirección en dos líneas, ciudad, código postal, provincia, país, teléfono).
Así que imaginad si tenéis 100.000 pedidos podéis llegar a generar 2.000.000 de registros en postmeta solo de esto.
Para resolver esto se pensó en una estructura de datos nueva mucho más eficiente, la llamada HPOS y que solo tiene un problema: los plugins para WooCommerce tienen que hacer las cosas bien para que todo siga funcionando igual.
Como el cambio mayor tiene que ver con el uso de metadatos asociados a pedidos, la idea básicamente es que cualquier acceso a los mismos, se haga con las clases y métodos que estrenó hace ya años WooCommerce en la versión 3.0, que ya alguien pensó en este problema probablemente; y dejar de usar las primitivas típicas de WordPress. Es decir.
Donde antes leía un valor de un metadato haciendo:
get_post_meta( $order->get_id(), $key, true );
Ahora hago:
$order->get_meta( $key );
Y algo parecido para las modificaciones:
update_post_meta( $order->get_id(), $key, $value );
Ahora son:
$order->update_meta_data( $key, $value );
Esto es un resumen muy por encima, pero os viene bien para introduciros y así ya luego leer aquí el manual al completo.
Y bueno, si haces todo esto pero no declaras compatibilidad, WooCommerce advertirá a tus usuarios de que tu plugin no es compatible, aunque realmente lo sea. Y es que como en tantas otras cosas con plugins y WordPress y software en general, al final, el software no sabe si es compatible y es el autor el que tiene que declarar esta compatibilidad.
De hecho tanto es así, que podría darse el caso contrario, plugins no compatibles que declaren compatibilidad… pero eso no es serio. Es algo parecido a cuando se marca que un plugin es compatible con una versión X de WordPress, WP no lo sabe realmente pero lo lee de lo que dice el autor. Somos profesionales y debe hacerse buen uso de estas declaraciones.
Así que bueno, la declaración de compatibilidad se hace así en este caso.
// al comienzo del fichero principal del plugin añadimos que vamos a usar este espacio de nombres use \Automattic\WooCommerce\Utilities\FeaturesUtil; ... // en ese mismo fichero, declaramos la compatibilidad haciendo esta llamada unida a este hook add_action( 'before_woocommerce_init', function() { if ( !class_exists( FeaturesUtil::class ) ) return; FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true ); } );
Así que espero haberos introducido un poco en este tema y haberos ayudados si estáis liados haciendo plugins para WooCommerce y WordPress.
Nota: Hay una valoración incrustada en esta entrada, por favor, visita esta entrada para valorarla.RedSys aparte de los pagos normales, llamados autorizaciones, acepta una variedad de operaciones: desde autorizaciones…
WooCommerce permite ordenar los productos de una forma nativa, para poder presentar primero los que…
Cada vez que hay una actualización grande del núcleo WordPress, por defecto WordPress te instala…
Una pantalla LCD es una pantalla delgada y hecha de cristal líquido. Se usa en…
De todos los plugins que existen para Gravity Forms, que son numerosos porque la propia…
Un CMS, como WordPress, facilita la creación y gestión de contenido en la web, sin…