HPOS accélère WooCommerce en stockant les commandes dans des tables dédiées. Vous gagnez en rapidité, en fiabilité et en scalabilité. Pour les nouvelles boutiques, HPOS est activé par défaut. Pour les sites plus anciens, vous pouvez l’activer en toute sécurité après vérification des extensions.
Dans cet article, je vous montre comment rendre votre plugin compatible avec HPOS. Vous verrez comment déclarer la compatibilité, utiliser l’API WooCommerce plutôt que les fonctions WordPress génériques et tester correctement. Enfin, je liste des pièges courants et des astuces de performance.
HPOS en deux minutes
- Les commandes ne vivent plus dans
wp_posts/wp_postmeta. - HPOS ajoute des tables dédiées aux commandes, adresses et index.
- Résultat : création de commande plus rapide et recherche d’ordre plus fluide.
1. Déclarez la compatibilité HPOS
Ajoutez la déclaration dans le fichier principal de votre plugin. C’est le signal officiel pour WooCommerce.
<?php
/**
* Plugin Name: Mon Plugin — Compat HPOS
* Description: Déclare la compatibilité HPOS pour WooCommerce.
* Author: Vous
* Version: 1.0.0
*
* @package MonPlugin
*/
use Automattic\\WooCommerce\\Utilities\\FeaturesUtil;
defined( 'ABSPATH' ) || exit;
/**
* Déclare la compatibilité HPOS pour le plugin.
*
* @since 1.0.0
* @return void
*/
function monplugin_declarer_compatibilite_hpos() : void {
// Vérifie la disponibilité de la classe avant l'appel.
if ( class_exists( FeaturesUtil::class ) ) {
// Le troisième argument = true -> compatible ; false -> incompatible (affiche un avertissement aux admins).
FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true );
}
}
add_action( 'before_woocommerce_init', 'monplugin_declarer_compatibilite_hpos' );Code language: PHP (php)
2. Utilisez l’API WooCommerce (CRUD), pas les fonctions WP
N’utilisez pas get_post() ou get_post_meta() pour les commandes. Servez-vous des objets WC_Order et des méthodes WC_Data.
<?php
/**
* Récupère et modifie une commande via l'API WooCommerce (compatible HPOS).
*
* @param int $order_id Identifiant de la commande.
* @return void
*/
function monplugin_mettre_a_jour_commande( int $order_id ) : void {
// Au lieu de get_post( $order_id ).
$order = wc_get_order( $order_id ); // Retourne un objet WC_Order ou null.
if ( ! $order instanceof WC_Order ) {
return;
}
// Métadonnées : utiliser les méthodes WC_Data (HPOS-safe).
$order->update_meta_data( '_monplugin_flag', 'yes' );
$order->add_meta_data( '_monplugin_score', 95 );
// Sauvegarde unique pour réduire les I/O (perf).
$order->save();
}Code language: HTML, XML (xml)
Remplacements typiques :
get_post_meta()→$order->get_meta( $key, true );update_post_meta()→$order->update_meta_data( $key, $value ); $order->save();add_post_meta()→$order->add_meta_data( $key, $value ); $order->save();delete_post_meta()→$order->delete_meta_data( $key ); $order->save();
