在 WooCommerce 中擴展 CRUD 數據存儲

已發表: 2018-01-25

你聽說過 CRUD 嗎? 在編程,它代表創建、讀取更新刪除,我們都對數據執行的基本操作。 使用 WooCommerce,其中包括存儲在您的數據庫中的產品、訂單、客戶、優惠券和其他數據。

WooCommerce 最近與 CRUD 相關的變化意味著該平台正在朝著更具可擴展性的方向發展。 注意:這篇文章確實具有技術性,並假設您對 PHP 代碼有一定的了解。

音頻學習者? 這篇文章的要點來自我在 WooConf 2017 的演講。

更具可擴展性的 WooCommerce

為了讓我們的開發人員更輕鬆,我們在 WooCommerce 3.0 中添加了特殊的 CRUD 對象。 這取代了 WooCommerce 中所有以前的帖子元代碼,並且所有擴展也必須使用它來使 WooCommerce 站點能夠擴展。

同時,我們添加了另一組名為 Data Stores 的對象,旨在將您的 WooCommerce 數據加載到數據庫中和從數據庫中保存。 這些抽象旨在使 WooCommerce 能夠處理大量訂單、產品和客戶。 這是通過連接到 WooCommerce 以使其使用不同的方式來存儲數據來實現的。

每個數據存儲實現都決定了數據的存儲和檢索方式,無論是來自數據庫還是其他完全存儲數據的方式。 通過使用它們,現在可以將 WooCommerce 擴展到企業銷售量,實現可以處理數百萬個訂單。 必須做的就是加入一個重新定義 WooCommerce 用於存儲數據的過濾器。

除了 CRUD 和數據存儲抽象可以提供的性能增強之外,這些構造還使您在為 WooCommerce 商店保存和加載數據的方式上提供了更大的靈活性。 對於每種類型的 WooCommerce 數據(產品、訂單、客戶等),您現在可以以編程方式決定數據應該從哪裡來以及應該去哪裡。 這允許商店建設者通過與其他系統交互來定制 WooCommerce 以滿足他們的需求,或者根據需要升級 WooCommerce 不同部分的性能。

除了 CRUD 和數據存儲抽象可以提供的性能增強之外,這些構造還使您在為 WooCommerce 商店保存和加載數據的方式上提供了更大的靈活性。

這到底是什麼意思呢? 好吧,考慮一下可能性:

  • 將訂單數據保存在與 wpdb 不同的數據庫中。
  • 從另一個系統上的現有數據庫中獲取產品數據。
  • 跨多個站點共享產品庫存(示例如下)。
    通過 API 從其他來源獲取產品數據。
    使用 CLI 命令從一個數據存儲加載並保存到另一個(內置導入/導出)。

擴展數據存儲

借助 CRUD 和數據存儲抽象,WooCommerce 不再關心數據來自何處或如何保存。 你可以自己控制這一切。

在下面的示例中,我從單獨的服務中檢索庫存計數,並且僅更改了每個產品對象的庫存計數。 這樣做的一個好處是我可以讓多個 WooCommerce 網站從相同的庫存數量進行銷售,並確保我沒有超賣我的庫存。

這是入口點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

對於實際的數據存儲,需要實現兩個接口: WC_Object_Data_Store_InterfaceWC_Product_Data_Store_Interface

此數據存儲旨在擴充現有數據存儲(通常是默認的 post 元實現)。 它在其構造函數中採用現有數據存儲,並且僅修改處理庫存的方式。 其他一切都通過現有的數據存儲正常處理。

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

對於大多數必需的功能,此數據存儲僅調用父數據存儲:

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

此數據存儲引入的唯一更改是如何讀取庫存。 對於這種情況,它通常從父數據存儲中讀取,但在返回之前會覆蓋庫存數量:

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

借助 CRUD 和數據存儲抽象,WooCommerce 不再關心數據來自何處或如何保存。 你可以自己控制這一切。

上面的庫存數量是從 API 中檢索的。 在現實世界的應用程序中,此 API 調用可能會轉到庫存控制系統、POS 甚至另一個 WooCommerce 站點。

上述示例的完整代碼位於:https://github.com/coderkevin/woocommerce-product-inventory-datastore

CRUD 對象和數據存儲的無限可能

如上面的示例所示,可能性是無窮無盡的。 WooCommerce 3.3 將於 1 月 30 日發布,其中包含與 CRUD 相關的另一個令人興奮的里程碑。 更多信息:WooCommerce 3.3 新 Webhooks CRUD。

發揮您的想像力,使用 CRUD 對象和數據存儲以新穎有趣的方式創建數據解決方案,並確保在評論中或加入 WooCommerce Slack 社區讓我們知道您的表現。