Newsletter

WooCommerce的多站点产品同步

向下滚动
胡洪刚
胡洪刚
I`m
  • Residence:
    Canada
  • City:
    Toronto
  • Age:
    26

2023-01-03

未分类

胡洪刚

假设你安装了一个WordPress多站点网络,而网络中的一些(或所有)站点是WooCommerce商店。

问题是,有时你可能需要在你的多站点网络的站点之间同步WooCommerce产品。

因为我们谈论的是WordPress多站点,我们不打算使用REST API,本教程将围绕switch_to_blog()函数和CRUD层。

创建产品

让我们假设我们有商店1和商店2作为WordPress多站点网络的一部分,当一个产品在商店1创建时,它也应该自动在商店2创建。

我们都知道save_post(和save_post_product)动作钩子,但我们应该在这里使用它们吗?也许我们可以看看Woocommerce_update_product在WooCommerce v3中的出现,因为至少你会有WC_Product对象作为其第二个参数。

也有woocommerce_new_product的钩子,但当你通过管理员创建一个WooCommerce产品时,它不会被激活。所以我们现在还是坚持使用woocommerce_update_product吧。

add_action( 'woocommerce_update_product', 'rudr_crosspost_product', 20, 2 );
function rudr_crosspost_product( $product_id, $product ) {
	remove_action( 'woocommerce_update_product', 'rudr_crosspost_product', 20, 2 );
	
	switch_to_blog( 2 );
	
	$new_product = new WC_Product_Simple();
	$new_product->set_name( $product->get_name() );
	$new_product->set_regular_price( floatval( $product->get_regular_price() ) );
	$new_product->save();
	restore_current_blog();
}

正如你所看到的,代码相当简单,但无论如何,有几个时刻是值得记住的。

首先请注意,我在第7行硬编码了博客的ID。因此,我总是要交叉张贴到ID=2的博客上,但这取决于你将如何处理它。当然,有了简单的多站点交叉张贴,事情就变得简单了。

请看一下第7行的remove_action()函数。这里不需要它,所以我注释了它。如果你决定使用save_post或save_post_product action hook,为了避免出现 “已达到最大嵌套级别 “的致命错误,在函数中删除这个动作是必要的。但是,当使用woocommerce_update_product钩子时,可以不在函数中删除它,尽管这个钩子在每次创建/更新产品时都会被激活两次。

你也可以看到,我只同步了产品名称和产品价格。为了交叉发布媒体文件,我建议你查看这个教程,其余的(属性、下载)都在这个教程或WooCommerce官方文档中描述。
还有一件小事是,我在设置产品价格之前使用了floatval()函数。没有这个函数,价格就不会被更新。

更新产品

在上一章中,我向你展示了如何在WordPress多站点网络中的多个WooCommerce商店同时创建WooCommerce产品。

但是,如果后来你决定更新产品,它的副本又要被创建!怎么办?而且是再次。问题是如何防止这种情况?

我认为将网站2的产品ID存储在网站1的同一产品的帖子元数据中是个不错的主意。然后我们只需检查该元数据,如果它存在,我们将更新该产品,如果它不存在–则创建一个新的产品。让我们开始吧!

add_action( 'woocommerce_update_product', 'rudr_crosspost_product', 20, 2 );
function rudr_crosspost_product( $product_id, $product ) {
	remove_action( 'woocommerce_update_product', 'rudr_crosspost_product', 20, 2 );
	//让我们尝试在网站2上获得同一产品的ID
	$site_2_product_id = $product->get_meta( 'site_2_product_id', true );
	// 切换到网站2
	switch_to_blog( 2 );
	if( $site_2_product_id ) {
		$site_2_product = wc_get_product( $site_2_product_id );
	}
	if( ! $site_2_product ) {
		$site_2_product = new WC_Product_Simple();
	}

	// 更新信息
	$site_2_product->set_name( $product->get_name() );
	$site_2_product->set_regular_price( floatval( $product->get_regular_price() ) );
	$site_2_product->save();
	restore_current_blog();
	$product->add_meta_data( 'site_2_product_id', $site_2_product->get_id(), true );
	$product->save_meta_data();

}
Write me a message
Write me a message