Extinderea depozitelor de date CRUD în WooCommerce

Publicat: 2018-01-25

Ai auzit de CRUD? În programare, înseamnă C reate, Read, U pdate și Delete , operațiuni de bază pe care le efectuăm cu toții cu datele noastre. Cu WooCommerce, asta include produse, comenzi, clienți, cupoane și alte date stocate în baza ta de date.

Modificările recente ale WooCommerce legate de CRUD înseamnă că platforma este pe cale să devină mai scalabilă. Notă: Această postare devine tehnică și presupune un anumit nivel de confort cu codul PHP.

Învățător audio? Punctele din această postare sunt din discursul meu de la WooConf 2017.

Un WooCommerce mai scalabil

Pentru a face viața mai ușoară dezvoltatorilor noștri, am adăugat obiecte speciale CRUD în WooCommerce 3.0. Acesta înlocuiește toate meta-codul post anterior din WooCommerce și trebuie, de asemenea, utilizat de toate extensiile pentru a permite scalarea unui site WooCommerce.

În același timp, am adăugat un alt set de obiecte numite Data Stores, care sunt concepute pentru a încărca și salva datele dvs. WooCommerce în și din baza de date. Aceste abstracții sunt concepute pentru a permite WooCommerce să gestioneze o cantitate mai mare de comenzi, produse și clienți. Acest lucru se realizează prin conectarea la WooCommerce pentru ca acesta să folosească diferite mijloace pentru stocarea datelor.

Fiecare implementare a depozitului de date determină modul în care datele sunt stocate și preluate, fie că sunt dintr-o bază de date sau dintr-o altă modalitate de stocare a datelor. Folosindu-le, este acum posibilă extinderea WooCommerce până la volumele de vânzări ale întreprinderilor, cu implementări care pot gestiona milioane de comenzi. Tot ceea ce trebuie făcut este să vă conectați la un filtru care redefinește ceea ce folosește WooCommerce pentru a stoca datele.

Pe lângă îmbunătățirile de performanță pe care CRUD și abstracțiile magazinului de date le pot oferi, aceste construcții permit mult mai multă flexibilitate în modul în care salvați și încărcați datele pentru magazinul dvs. WooCommerce. Pentru fiecare tip de date WooCommerce (produse, comenzi, clienți etc.), acum aveți posibilitatea de a decide programatic de unde ar trebui să provină acele date și unde ar trebui să meargă. Acest lucru le permite constructorilor de magazine să adapteze WooCommerce pentru a se potrivi nevoilor lor prin interfața cu alte sisteme sau să îmbunătățească performanța diferitelor părți ale WooCommerce, după cum este necesar.

Pe lângă îmbunătățirile de performanță pe care CRUD și abstracțiile magazinului de date le pot oferi, aceste construcții permit mult mai multă flexibilitate în modul în care salvați și încărcați datele pentru magazinul dvs. WooCommerce.

Ce înseamnă mai exact asta? Ei bine, gândiți-vă la posibilități:

  • Salvarea datelor comenzii într-o bază de date separată de wpdb.
  • Obținerea datelor despre produse dintr-o bază de date existentă pe alt sistem.
  • Partajarea inventarului de produse pe mai multe site-uri (exemplul de mai jos).
    Preluarea datelor despre produse printr-un API dintr-o altă sursă.
    Efectuarea unei comenzi CLI pentru a încărca dintr-un depozit de date și a salva în altul (import/export încorporat).

Extinderea depozitelor de date

Cu CRUD și abstracțiile magazinului de date, WooCommerce nu-i mai pasă de unde provin datele sau cum sunt salvate. Puteți controla totul singur.

În exemplul de mai jos, recuperez numărul de inventar de la un serviciu separat și se modifică numai numărul de inventar al fiecărui obiect de produs. Un beneficiu de a face acest lucru este că pot avea mai multe site-uri WooCommerce să vândă din același număr de inventar și să fiu sigur că nu mi-am supravândut stocul.

Aici este punctul de intrare, filtrul 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

Pentru depozitul de date propriu-zis, există două interfețe de implementat: WC_Object_Data_Store_Interface și WC_Product_Data_Store_Interface .

Acest depozit de date este conceput pentru a spori depozitul de date existent (de obicei, implementarea implicită post meta). Preia depozitul de date existent în constructorul său și modifică doar modul în care este gestionat inventarul. Orice altceva este gestionat în mod normal prin depozitul de date existent.

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

Pentru majoritatea funcțiilor necesare, acest depozit de date apelează doar depozitul de date părinte:

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

Singura modificare pe care o introduce acest depozit de date este modul în care este citit inventarul. În acest caz, citește în mod normal din depozitul de date părinte, dar înlocuiește cantitatea stocului înainte de a reveni:

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

Cu CRUD și abstracțiile magazinului de date, WooCommerce nu-i mai pasă de unde provin datele sau cum sunt salvate. Puteți controla totul singur.

Cantitatea de stoc de mai sus este preluată dintr-un API. Într-o aplicație din lumea reală, acest apel API ar putea merge la un sistem de control al inventarului sau la un POS sau chiar la un alt site WooCommerce.

Codul complet pentru exemplul de mai sus este disponibil la: https://github.com/coderkevin/woocommerce-product-inventory-datastore

Posibilități nesfârșite cu obiecte CRUD și depozite de date

După cum sa demonstrat în exemplele de mai sus, posibilitățile sunt nesfârșite. WooCommerce 3.3, care urmează să fie lansat pe 30 ianuarie, conține o nouă etapă interesantă legată de CRUD. Mai multe la: WooCommerce 3.3 Noi Webhooks CRUD.

Folosiți-vă imaginația pentru a crea soluții de date în moduri noi și interesante cu obiecte CRUD și depozite de date și asigurați-vă că ne spuneți cum vă descurcați fie în Comentarii, fie alăturându-vă comunității WooCommerce Slack.