WooCommerce:通过代码创建产品

2022-08-31 00:01:31

我的商店出售乙烯基贴纸。每个产品(贴纸)有144种变体(24种颜色,3种尺寸和2种方向)。分配唯一 SKU 需要每个变体。

手动填充目录是不现实的。我将制作一个表单,其中用户指定产品的名称,描述和主要图像,以及可能的大小和颜色。在处理表单时,我需要创建一个产品及其所有变体。

如何创建产品及其变体?


答案 1

我有类似的情况,这是我发现的。

产品实际上是自定义帖子类型(很明显!:P),因此您可以使用它来插入新产品。插入后,您将获得新产品帖子类型的ID,用于分别将元键和元值设置为 和。如果您未设置可见性,则新添加的产品将永远不会在您的店铺中可见。或者,您也可以从后端设置可见性。对于各种尺寸的产品,请使用该产品的变体。您可以为每个变体设置不同的类型,价格,SKU等。所有这些都是后元的,因此您可以使用php代码来添加变体和东西。研究该表以查看键名称。wp_insert_postupdate_post_meta_visibilityvisiblepostmeta


答案 2

正如 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_postupdate_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


推荐