Extension des magasins de données CRUD dans WooCommerce

Publié: 2018-01-25

Avez-vous entendu parler du CRUD ? En programmation, cela signifie créer , lire , mettre à jour et supprimer, des opérations de base que nous effectuons tous avec nos données. Avec WooCommerce, cela inclut les produits, les commandes, les clients, les coupons et d'autres données stockées dans votre base de données.

Les récents changements apportés à WooCommerce concernant CRUD signifient que la plate-forme est en passe d'être plus évolutive. Remarque : Ce message devient technique et suppose un certain niveau de confort avec le code PHP.

Audio-apprenant ? Les points de cet article proviennent de ma présentation à la WooConf 2017.

Un WooCommerce plus évolutif

Pour faciliter la vie de nos développeurs, nous avons ajouté des objets CRUD spéciaux dans WooCommerce 3.0. Cela remplace tous les méta-codes de publication précédents dans WooCommerce et doit également être utilisé par toutes les extensions pour permettre à un site WooCommerce de s'adapter.

Dans le même temps, nous avons ajouté un autre ensemble d'objets appelés Data Stores, qui sont conçus pour charger et enregistrer vos données WooCommerce vers et depuis la base de données. Ces abstractions sont conçues pour permettre à WooCommerce de gérer un plus grand nombre de commandes, de produits et de clients. Ceci est accompli en se connectant à WooCommerce pour lui faire utiliser différents moyens pour stocker des données.

Chaque implémentation de magasin de données détermine la manière dont les données sont stockées et récupérées, qu'elles proviennent d'une base de données ou d'une autre manière de stocker les données. En les utilisant, il est désormais possible d'adapter WooCommerce aux volumes de vente de l'entreprise, avec des implémentations capables de gérer des millions de commandes. Tout ce qu'il faut faire est de se connecter à un filtre qui redéfinit ce que WooCommerce utilise pour stocker des données.

En plus des améliorations de performances que les abstractions CRUD et de magasin de données peuvent fournir, ces constructions offrent beaucoup plus de flexibilité dans la façon dont vous enregistrez et chargez les données pour votre boutique WooCommerce. Pour chaque type de données WooCommerce (produits, commandes, clients, etc.), vous avez désormais la possibilité de décider par programmation d'où ces données doivent provenir et où elles doivent aller. Cela permet aux constructeurs de magasins d'adapter WooCommerce à leurs besoins en s'interfaçant avec d'autres systèmes ou d'améliorer les performances de différentes parties de WooCommerce selon les besoins.

En plus des améliorations de performances que les abstractions CRUD et de magasin de données peuvent fournir, ces constructions offrent beaucoup plus de flexibilité dans la façon dont vous enregistrez et chargez les données pour votre boutique WooCommerce.

Qu'est-ce que cela veut dire exactement? Eh bien, pensez aux possibilités:

  • Enregistrement des données de commande dans une base de données distincte de wpdb.
  • Obtenir des données produit à partir d'une base de données existante sur un autre système.
  • Partage de l'inventaire des produits sur plusieurs sites (exemple ci-dessous).
    Récupération des données produit via une API à partir d'une autre source.
    Création d'une commande CLI pour charger à partir d'un magasin de données et enregistrer dans un autre (import/export intégré).

Extension des magasins de données

Avec les abstractions CRUD et de magasin de données, WooCommerce ne se soucie plus de la provenance des données ni de la manière dont elles sont enregistrées. Vous pouvez tout contrôler vous-même.

Dans l'exemple ci-dessous, je récupère le décompte d'inventaire d'un service distinct, et seul le décompte d'inventaire de chaque objet produit est modifié. L'un des avantages de cette opération est que je peux vendre plusieurs sites WooCommerce à partir du même inventaire et m'assurer que je n'ai pas survendu mon stock.

Voici le point d'entrée, le filtre install_data_store .

class WC_Product_Inventory_Data_Store_Plugin {
public function __construct() {
add_filter( 'woocommerce_data_stores', array( $this, 'install_data_store' ) );
}
public function install_data_store( $stores ) {
include_once dirname( __FILE__ ) . '/class-product-inventory-data-store.php';
$instance = new WC_Product_Inventory_Data_Store( $stores[ 'product' ] );
$stores[ 'product' ] = $instance;
return $stores;
}
}
new WC_Product_Inventory_Data_Store_Plugin();
view raw class-woocommerce-product-inventory-datastore-plugin.php hosted with ❤ by GitHub

Pour le magasin de données réel, il y a deux interfaces à implémenter : WC_Object_Data_Store_Interface et WC_Product_Data_Store_Interface .

Ce magasin de données est conçu pour augmenter le magasin de données existant (généralement l'implémentation post-méta par défaut). Il prend le magasin de données existant dans son constructeur et ne modifie que la façon dont l'inventaire est géré. Tout le reste est géré normalement via le magasin de données existant.

class WC_Product_Inventory_Data_Store
implements WC_Object_Data_Store_Interface, WC_Product_Data_Store_Interface {
public function __construct( &$parent_data_store ) {
$this- > parent_instance = $this- > create_parent_instance( $parent_data_store );
}
view raw class-product-inventory-data-store.php hosted with ❤ by GitHub

Pour la plupart des fonctions requises, ce magasin de données appelle simplement le magasin de données parent :

public function update( &$product ) {
$this- > parent_instance- > update( $product );
}
view raw class-product-inventory-data-store.php hosted with ❤ by GitHub

Le seul changement que ce magasin de données introduit est la façon dont l'inventaire est lu. Dans ce cas, il lit normalement à partir du magasin de données parent, mais remplace la quantité de stock avant de renvoyer :

public function read( &$product ) {
$this- > parent_instance- > read( $product );
$inventory_url = 'http://localhost:8080/api/inventory/' . $product- > get_sku();
$request = wp_remote_get( $inventory_url );
$response = wp_remote_retrieve_body( $request );
$data = json_decode( $response );
$product- > set_stock_quantity( $data );
}
view raw class-product-inventory-data-store.php hosted with ❤ by GitHub

Avec les abstractions CRUD et de magasin de données, WooCommerce ne se soucie plus de la provenance des données ni de la manière dont elles sont enregistrées. Vous pouvez tout contrôler vous-même.

La quantité de stock ci-dessus est extraite d'une API. Dans une application réelle, cet appel d'API peut être dirigé vers un système de contrôle des stocks, un point de vente ou même un autre site WooCommerce.

Le code complet de l'exemple ci-dessus est disponible sur : https://github.com/coderkevin/woocommerce-product-inventory-datastore

Des possibilités infinies avec les objets CRUD et les magasins de données

Comme démontré dans les exemples ci-dessus, les possibilités sont infinies. WooCommerce 3.3, dont la sortie est prévue le 30 janvier, contient une autre étape passionnante concernant CRUD. Plus sur : WooCommerce 3.3 Nouveaux Webhooks CRUD.

Utilisez votre imagination pour créer des solutions de données de manière nouvelle et intéressante avec des objets CRUD et des magasins de données, et assurez-vous de nous faire savoir comment vous vous en sortez soit dans les commentaires, soit en rejoignant la communauté WooCommerce Slack.