WooCommerce是一个 WordPress插件,为了方便利用 WordPress 的便利性进行开发,WooCommerce开发团队使用了 WordPress 的自定义文章类型来存储订单,相信开发过WooCommerce主题或插件的朋友都了解这一点。
使用文章类型存储WooCommerce数据的问题
混乱的WooCommerce数据存取方式
既然商品和订单都是文章类型,我们就可以使用 WordPress 的 get_posts 或 WP_Query 来存储或获取这些数据。存储文章的 wp_posts 数据表字段有限,无法存储丰富的商品和订单数据表,所以,一部分数据是存储在 post_meta 中。我们可以通过 WordPress 的 get_post_meta 和 updata_post_meta 函数来存取这些数据。
同时,WooCommerce提供了 wc_get_product*
和 wc_get_order*
函数来帮助开发者存取数据。
一些开发者喜欢使用原生 MySQL 或一些 ORM ,通过直接操作 MySQL 数据表来存取WooCommerce商品或订单数据。
不得不说,真 TM 混乱。
大量 post_meta 带来的性能问题
另外,默认情况下,如果用户在站点下了一个订单,WooCommerce会为每一个订单创建至少 40 个 post_meta 数据,也就是说,如果网站每天有 10 个订单,post_meta 数据表就要增加 400 行。post_meta 数据表越大,执行订单查询的时间就越长,这是一个不容忽视的性能问题。
为了解决数据存取方式的混乱问题,我们需要要求开发者可以并且只能通过一种方式来访问数据。为了解决性能问题,我们需要更换数据的存储方式和存储位置。
WooCommerceCRUD 抽象类是什么?
在 3.0 版本中,WooCommerce提供了新的 CRUD 类来解决这个问题。这是一个抽象的接口,通过这个接口,我们可以实现。
- 自定义每种数据的数据结构
- 存取数据时,对任何一种数据做必要的验证
- 作为开发者,我们不需要知道数据的存储位置,只需要知道操作数据的 API 函数
- 把数据存储到自定义数据表中,而不会影响数据的调用方式
- 使用相同的代码在后台更新数据,就像在 REST API 和 CLI 中那样 – 一切都是统一的。
- 更少的代码,也意味着更少的 Bug,和更高的单元测试覆盖率。
有哪些数据将会被迁移到这个 CRUD 系统?
- 产品
- 顾客
- 订单
- 订单商品
- 优惠券
这些都是WooCommerce中的主要数据类型,目前每个类型都是以自定义文章类型存储的。除了顾客数据是存储在用户和用户元数据中的。
两种储存WooCommerce数据方法的对比
我们来通过代码看一下新的 CRUD 系统是怎么使用的。下面的代码中,我们需要更新客户的订单姓名。
$order_id = 100;
update_post_meta( $order_id, '_billing_first_name', 'Fred' );
update_post_meta( $order_id, '_billing_last_name', 'Flintstone' );
我们需要知道订单的文章 ID,每个数据的 meta_key的元键,还要处理所有的验证,真累!
使用 CRUD,我们是这样更新这两个数据的。
$order_id = 100;
$order = wc_get_order( $order ); //得到 $order 类
$order->set_billing_first_name( 'Fred );
$order->set_billing_last_name( 'Flintstone' );
$order->save();
等等,代码咋看着还多了一行?别急,上面的代码中,我们只需要知道 $order_id 这一个数据就可以了,至于获取数据的类方法,我们可以通过 IDE(如 PHPStorm)的提示来输入。并且通过这种方式,我们不需要关心数据在数据库中是怎么存储的,非常方便兼容未来的WooCommerce版本。
WooCommerce新 CRUD 类的意义
看起来,WooCommerce在逐步脱离 WordPress,表面上是这样的,其实WooCommerce底层还是使用了很多 WordPress 的 API,完全脱离 WordPress 不大可能。不要忘了,WooCommerce现在已经是 WordPress 母公司 Automatic 的产品了。
整体上来说,这个变化是好的,WooCommerceCRUD 类为开发人员提供了更统一的数据访问接口,意味着更好的稳定性,只要使用标准的方式访问数据,开发者就可以不用担心底层数据的变化;为数据访问提供了抽象层,意味着更大的灵活性,WooCoomerce 的数据可以很方便的被存储在其他数据表中,而开发者不用改变访问数据的方式。