Erweitern von CRUD-Datenspeichern in WooCommerce

Veröffentlicht: 2018-01-25

Haben Sie schon von CRUD gehört? In der Programmierung steht es für C reate , Read, U pdate und D elete, grundlegende Operationen, die wir alle mit unseren Daten ausführen. Bei WooCommerce gehören dazu Produkte, Bestellungen, Kunden, Coupons und andere Daten, die in Ihrer Datenbank gespeichert sind.

Die jüngsten Änderungen an WooCommerce in Bezug auf CRUD bedeuten, dass die Plattform auf dem Weg ist, skalierbarer zu werden. Hinweis: Dieser Beitrag wird technisch und setzt ein gewisses Maß an Komfort im Umgang mit PHP-Code voraus.

Audio-Lerner? Die Punkte in diesem Beitrag stammen aus meinem Vortrag auf der WooConf 2017.

Ein besser skalierbarer WooCommerce

Um unseren Entwicklern das Leben zu erleichtern, haben wir in WooCommerce 3.0 spezielle CRUD-Objekte hinzugefügt. Dieser ersetzt den gesamten bisherigen Post-Meta-Code in WooCommerce und muss auch von allen Erweiterungen verwendet werden, um eine Skalierung einer WooCommerce-Site zu ermöglichen.

Gleichzeitig haben wir einen weiteren Satz von Objekten namens Data Stores hinzugefügt, die dazu dienen, Ihre WooCommerce-Daten in die und aus der Datenbank zu laden und zu speichern. Diese Abstraktionen sollen es WooCommerce ermöglichen, eine größere Menge an Bestellungen, Produkten und Kunden zu verarbeiten. Dies wird erreicht, indem man sich in WooCommerce einklinkt, damit es verschiedene Mittel zum Speichern von Daten verwendet.

Jede Datenspeicherimplementierung bestimmt, wie die Daten gespeichert und abgerufen werden, unabhängig davon, ob es sich um eine Datenbank oder eine andere Art der Datenspeicherung insgesamt handelt. Durch ihre Verwendung ist es jetzt möglich, WooCommerce auf Unternehmensverkaufsvolumen zu skalieren, mit Implementierungen, die Millionen von Bestellungen verarbeiten können. Alles, was getan werden muss, ist, sich in einen Filter einzuklinken, der neu definiert, was WooCommerce zum Speichern von Daten verwendet.

Zusätzlich zu den Leistungsverbesserungen, die die CRUD- und Datenspeicher-Abstraktionen bieten können, ermöglichen diese Konstrukte viel mehr Flexibilität beim Speichern und Laden von Daten für Ihren WooCommerce-Shop. Für jede Art von WooCommerce-Daten (Produkte, Bestellungen, Kunden usw.) haben Sie jetzt die Möglichkeit, programmgesteuert zu entscheiden, woher diese Daten kommen und wohin sie gehen sollen. Auf diese Weise können Ladenbauer WooCommerce an ihre Bedürfnisse anpassen, indem sie sich mit anderen Systemen verbinden oder die Leistung verschiedener Teile von WooCommerce nach Bedarf verbessern.

Zusätzlich zu den Leistungsverbesserungen, die die CRUD- und Datenspeicher-Abstraktionen bieten können, ermöglichen diese Konstrukte viel mehr Flexibilität beim Speichern und Laden von Daten für Ihren WooCommerce-Shop.

Was genau bedeutet das? Nun, denken Sie über die Möglichkeiten nach:

  • Bestelldaten in einer separaten Datenbank von wpdb speichern.
  • Abrufen von Produktdaten aus einer bestehenden Datenbank auf einem anderen System.
  • Gemeinsame Nutzung von Produktbeständen über mehrere Standorte hinweg (Beispiel unten).
    Abrufen von Produktdaten über eine API aus einer anderen Quelle.
    Erstellen eines CLI-Befehls zum Laden von einem Datenspeicher und zum Speichern in einem anderen (integrierter Import/Export).

Datenspeicher erweitern

Mit den CRUD- und Data-Store-Abstraktionen kümmert sich WooCommerce nicht mehr darum, woher die Daten kommen oder wie sie gespeichert werden. Das kannst du alles selbst steuern.

Im folgenden Beispiel rufe ich die Bestandszählung von einem separaten Dienst ab, und nur die Bestandszählung jedes Produktobjekts wird geändert. Ein Vorteil dabei ist, dass ich mehrere WooCommerce-Websites mit derselben Bestandsanzahl verkaufen kann und sicher sein kann, dass ich meinen Bestand nicht überverkauft habe.

Hier ist der Einstiegspunkt, der install_data_store -Filter.

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

Für den eigentlichen Datenspeicher müssen zwei Schnittstellen implementiert werden: WC_Object_Data_Store_Interface und WC_Product_Data_Store_Interface .

Dieser Datenspeicher wurde entwickelt, um den vorhandenen Datenspeicher (normalerweise die standardmäßige Post-Meta-Implementierung) zu erweitern. Es übernimmt den vorhandenen Datenspeicher in seinem Konstruktor und ändert nur die Art und Weise, wie Inventar gehandhabt wird. Alles andere wird normal über den vorhandenen Datenspeicher abgewickelt.

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

Für die meisten erforderlichen Funktionen ruft dieser Datenspeicher einfach den übergeordneten Datenspeicher auf:

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

Die einzige Änderung, die dieser Datenspeicher einführt, ist, wie das Inventar gelesen wird. In diesem Fall liest es normalerweise aus dem übergeordneten Datenspeicher, überschreibt jedoch die Bestandsmenge, bevor es zurückkehrt:

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

Mit den CRUD- und Data-Store-Abstraktionen kümmert sich WooCommerce nicht mehr darum, woher die Daten kommen oder wie sie gespeichert werden. Sie können das alles selbst steuern.

Die obige Bestandsmenge wird von einer API abgerufen. In einer realen Anwendung könnte dieser API-Aufruf an ein Bestandskontrollsystem, einen POS oder sogar eine andere WooCommerce-Site gehen.

Der vollständige Code für das obige Beispiel ist verfügbar unter: https://github.com/coderkevin/woocommerce-product-inventory-datastore

Unendliche Möglichkeiten mit CRUD-Objekten und Datenspeichern

Wie in den obigen Beispielen gezeigt, sind die Möglichkeiten endlos. WooCommerce 3.3, das am 30. Januar veröffentlicht werden soll, enthält einen weiteren spannenden Meilenstein in Bezug auf CRUD. Mehr unter: WooCommerce 3.3 Neue Webhooks CRUD.

Nutzen Sie Ihre Vorstellungskraft, um Datenlösungen auf neue und interessante Weise mit CRUD-Objekten und Datenspeichern zu erstellen, und lassen Sie uns wissen, wie es Ihnen geht, entweder in den Kommentaren oder indem Sie der WooCommerce Slack-Community beitreten.