在 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 社区让我们知道您的表现。