WooCommerce
Rendre une extension WooCommerce compatible HPOS
Depuis WooCommerce 8.2, les nouvelles boutiques rangent leurs commandes dans des tables dédiées. Une extension qui lit les commandes comme des articles WordPress ne voit plus rien, et WooCommerce la signale comme incompatible. Deux choses à faire : déclarer la compatibilité, et surtout passer par les objets de commande plutôt que par les métadonnées d’articles.
// Dans le fichier principal de l'extension
add_action('before_woocommerce_init', function () {
if (class_exists(\Automattic\WooCommerce\Utilities\FeaturesUtil::class)) {
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility(
'custom_order_tables', __FILE__, true
);
}
});
La déclaration ne suffit pas : elle promet à WooCommerce que le code est prêt, elle ne le rend pas prêt. Il faut chercher dans l’extension tous les get_post_meta, update_post_meta, get_posts et requêtes SQL qui touchent aux commandes, et les remplacer. Sans oublier $commande->save() après chaque modification. Les requêtes SQL directes sur wp_posts ou wp_postmeta pour des commandes sont les plus difficiles à repérer, et les plus dangereuses.
// À remplacer : lit l'ancien stockage, invisible sous HPOS
$transporteur = get_post_meta($order_id, '_w4u_transporteur', true);
update_post_meta($order_id, '_w4u_transporteur', 'colissimo');
$ids = get_posts(['post_type' => 'shop_order', 'post_status' => 'wc-processing',
'numberposts' => -1, 'fields' => 'ids']);
// Compatible avec les deux stockages
$commande = wc_get_order($order_id);
$transporteur = $commande->get_meta('_w4u_transporteur');
$commande->update_meta_data('_w4u_transporteur', 'colissimo');
$commande->save();
$ids = wc_get_orders(['status' => 'processing', 'limit' => -1, 'return' => 'ids']);
Sources
- WooCommerce, recettes de migration HPOS github.com