WooCommerce:通过代码创建产品
我的商店出售乙烯基贴纸。每个产品(贴纸)有144种变体(24种颜色,3种尺寸和2种方向)。分配唯一 SKU 需要每个变体。
手动填充目录是不现实的。我将制作一个表单,其中用户指定产品的名称,描述和主要图像,以及可能的大小和颜色。在处理表单时,我需要创建一个产品及其所有变体。
如何创建产品及其变体?
我的商店出售乙烯基贴纸。每个产品(贴纸)有144种变体(24种颜色,3种尺寸和2种方向)。分配唯一 SKU 需要每个变体。
手动填充目录是不现实的。我将制作一个表单,其中用户指定产品的名称,描述和主要图像,以及可能的大小和颜色。在处理表单时,我需要创建一个产品及其所有变体。
如何创建产品及其变体?
我有类似的情况,这是我发现的。
产品实际上是自定义帖子类型(很明显!:P),因此您可以使用它来插入新产品。插入后,您将获得新产品帖子类型的ID,用于分别将元键和元值设置为 和。如果您未设置可见性,则新添加的产品将永远不会在您的店铺中可见。或者,您也可以从后端设置可见性。对于各种尺寸的产品,请使用该产品的变体。您可以为每个变体设置不同的类型,价格,SKU等。所有这些都是后元的,因此您可以使用php代码来添加变体和东西。研究该表以查看键名称。wp_insert_post
update_post_meta
_visibility
visible
postmeta
正如 Jason 在他的评论中所写的那样,REST API 是通往这里的道路。即使没有HTTP REST请求,也可以完成此操作,使其即使在禁用REST接口的Wordpress安装上也可以工作。
以下是我为此目的制作的一个简单的函数:
$products_controler = new WC_REST_Products_Controller();
function create_item($rest_request) {
global $products_controler;
if (!isset($rest_request['status']))
$rest_request['status'] = 'publish';
$wp_rest_request = new WP_REST_Request('POST');
$wp_rest_request->set_body_params($rest_request);
return $products_controler->create_item($wp_rest_request);
}
这里,是一个你通常通过REST发送的数组(请参阅这里的文档)。$rest_request
该变量是全局的,因为我需要多次调用此函数,并且我不想每次都重新创建对象。随意将其本地化。$products_controler
这适用于所有类型的产品(简单,分组,可变,...),并且它应该比通过和手动添加产品更能抵抗WooCommerce的内部更改。wp_insert_post
update_post_meta
编辑:鉴于这个答案仍然偶尔会得到支持,这是一个WooCommerce 3.0 +更新。变化是变体不再自动添加,因此我们必须自己完成。
这是该函数的当前版本:
protected function create_item( $rest_request ) {
if ( ! isset( $rest_request['status'] ) ) {
$rest_request['status'] = $this->plugin->get_option( 'default_published_status' );
}
if ( ! isset( $this->products_controler ) ) {
$this->products_controler = new WC_REST_Products_Controller();
}
$wp_rest_request = new WP_REST_Request( 'POST' );
$wp_rest_request->set_body_params( $rest_request );
$res = $this->products_controler->create_item( $wp_rest_request );
$res = $res->data;
// The created product must have variations
// If it doesn't, it's the new WC3+ API which forces us to build those manually
if ( ! isset( $res['variations'] ) )
$res['variations'] = array();
if ( count( $res['variations'] ) == 0 && count( $rest_request['variations'] ) > 0 ) {
if ( ! isset( $this->variations_controler ) ) {
$this->variations_controler = new WC_REST_Product_Variations_Controller();
}
foreach ( $rest_request['variations'] as $variation ) {
$wp_rest_request = new WP_REST_Request( 'POST' );
$variation_rest = array(
'product_id' => $res['id'],
'regular_price' => $variation['regular_price'],
'image' => array( 'id' => $variation['image'][0]['id'], ),
'attributes' => $variation['attributes'],
);
$wp_rest_request->set_body_params( $variation_rest );
$new_variation = $this->variations_controler->create_item( $wp_rest_request );
$res['variations'][] = $new_variation->data;
}
}
return $res;
}
这用于风筝打印和按需发货插件,从(即将发布的)版本1.1开始,在文件中。api/publish_products.php
还有一个更长的“快速”版本,它直接写入数据库,使其对未来WP / WC更改的弹性可能降低,但它要快得多(几秒钟而不是几分钟,因为我的测试计算机上我们的34种产品系列)。create_products_fast