【问题标题】:Bulk create WooCommerce products programmatically以编程方式批量创建 WooCommerce 产品
【发布时间】:2017-02-06 09:46:49
【问题描述】:

可以在 WooCommerce 上批量创建产品吗? 我正在使用 wp-cli Product 命令,但似乎我必须一个一个地创建。

<?php

$products = array(
    array('title' => 'My product 1'),
    array('title' => 'My product 2'),
    // ...
    // 10.000 more products
);

foreach ($products as $product) {
    $cliProduct = new WC_CLI_Product();
    $cliProduct->create(array(), $product);
    WP_CLI::success("Added Product #{$product['title']}");
}

这需要很多时间,因为它要对每个产品进行查询,更糟糕的是,这将是一个定期运行的 cron 作业。我还必须检查产品是否存在,在这种情况下,更新它而不是创建新产品。

所以查询次数将乘以2。

产品存在吗?更新它,否则创建它

有没有更好的方法来做到这一点? 也许我应该直接查询数据库,但它看起来很脏。

是否有任何 WP 功能可以查询数据库而无需创建自己的数据库连接?

【问题讨论】:

  • 您只想使用wp-cli 创建?或者自定义函数会做吗?如果是这样,那么我可以通过使用我的 this answer 构建来回答您的问题。
  • 是的。任何创建产品的脚本都是有效的。甚至 WooCommerce REST API 也将有效(现在尝试)。我会检查你的答案。

标签: php wordpress woocommerce wp-cli


【解决方案1】:

我在 2017 年写了这个答案,当时 WooCommerce 版本低于 如果您使用的是 WooCommerce 3.0 版。然后please refer to this answer。

截至 2022 年 3 月,此答案仍然有效,但 I will recommend using this answer 适用于 > v3.0。

假设您有一个这样的数组,并且您有 Unique SKU 来识别产品。

$products = [
    0 => [
        'title' => 'My Simple product 1',
        'sku' => 'sku1',
        'product_cat' => 'My cat'
    //...
    //...
    ],
    1 => [
        'title' => 'My Simple product 1',
        'sku' => 'sku1'
    //...
    //...
    ]
];

通过myCustomProduct()方法传递上述数组。

function myCustomProduct($product_array)
{
    if (!empty($product_array)):
        foreach ($product_array as $product):
            $product_id = wc_get_product_id_by_sku($product['sku']);
            //no product exist with the given SKU so create one
            if (!$product_id):
                $post = [
                    'post_author' => '',
                    'post_content' => $product['content'],
                    'post_status' => "publish",
                    'post_title' => wp_strip_all_tags($product['title']),
                    'post_name' => $product['title'],
                    'post_parent' => '',
                    'post_type' => "product",
                ];
                //Create Post
                $product_id = wp_insert_post($post, $wp_error);

                //set Product Category
                wp_set_object_terms($product_id, $product['product_cat'], 'product_cat');

                //set product type
                wp_set_object_terms($product_id, 'simple', 'product_type');

                update_post_meta($product_id, '_sku', $product['sku']);
                update_post_meta($product_id, 'total_sales', '0');

            //product found
            else:
                $post = [
                    'ID' => $product_id,
                    'post_title' => $product['title'],
                    'post_content' => $product['content'],
                ];
                $post_id = wp_update_post($post, true);
//              if (is_wp_error($post_id))
//              {
//                  $errors = $post_id->get_error_messages();
//                  foreach ($errors as $error)
//                  {
//                      echo $error;
//                  }
//              }
            endif;

            update_post_meta($product_id, '_visibility', 'visible');
            update_post_meta($product_id, '_stock_status', 'instock');
            update_post_meta($product_id, '_product_attributes', array());
            update_post_meta($product_id, '_manage_stock', "yes");
            update_post_meta($product_id, '_backorders', "no");
            update_post_meta($product_id, '_stock', $product['qty']);
            update_post_meta($product_id, '_price', $product['price']);
            //update_post_meta($product_id, '_downloadable', 'yes');
            //update_post_meta($product_id, '_virtual', 'yes');
            //update_post_meta($product_id, '_regular_price', "1");
            //update_post_meta($product_id, '_sale_price', "1");
            //update_post_meta($product_id, '_purchase_note', "");
            //update_post_meta($product_id, '_featured', "no");
            //update_post_meta($product_id, '_weight', "");
            //update_post_meta($product_id, '_length', "");
            //update_post_meta($product_id, '_width', "");
            //update_post_meta($product_id, '_height', "");
            //update_post_meta($product_id, '_sale_price_dates_from', "");
            //update_post_meta($product_id, '_sale_price_dates_to', "");
            //update_post_meta($product_id, '_price', "1");
            //update_post_meta($product_id, '_sold_individually', "");
        endforeach;
    endif;
}

这将为您简要介绍如何创建/更新产品;如果您需要任何进一步的帮助,那么您必须分享您的 4-5 个数组元素,以便我可以了解您要创建的产品类型以及它将具有哪些字段/元数据。

希望这会有所帮助!

【讨论】:

  • 感谢您的帮助,但这会很慢。查询太多。我已经成功创建了单品,问题是如何分块创建产品,这样你可以快速导入+5000个产品,而无需逐个添加产品。否则会花费太多时间。
  • 会很慢,因为 WooCommerce 不会将数据存储在单个平面表中,因此您希望“先检查然后更新或创建”因此需要时间;但是如果您可以提供少量示例数据,那么我可以优化我的代码;如果不看数组,很难说出要保存哪些字段。
  • 是的,但我发现 WooCommerce 有一个我正在检查的“产品/批次”端点。我检查了该端点的源代码,看起来它只是遍历所有项目并在每个项目上调用 create_item,没有针对批量创建它们的优化。所以我想我会坚持你的回答。
  • 可变产品呢?
  • @RaunakGupta 好的,我已经创建了一个房间,并将您所寻找的信息发送给您,期待您的回复。
【解决方案2】:

适用于 WooCommerce 3.0 或更高版本。

假设您有一个这样的数组,并且您有 Unique SKU 来识别产品。

$products = [
    0 => [
        'title' => 'My Simple product 1',
        'sku' => 'sku1',
        'category_ids' => [23,45]
    //...
    //...
    ],
    1 => [
        'title' => 'My Simple product 1',
        'sku' => 'sku1'
    //...
    //...
    ]
];

通过wh_myCustomProduct()方法传递上述数组。

function wh_myCustomProduct($product_array)
{
    if (!empty($product_array)):
        foreach ($product_array as $product):
            $product_id = wc_get_product_id_by_sku($product['sku']);
            //no product exist with the given SKU so create one
            if (empty($product_id)):
                
                $product_id = wh_createOrUpdateProduct($product);
            //product found
            else:
                
                $product_id = wh_createOrUpdateProduct($product,$product_id);
            endif;

        endforeach;
    endif;
}

function wh_createOrUpdateProduct($product, $productId = 0){
    $objProduct = new WC_Product($productId);
    $objProduct->set_sku($product['id']); //Set product SKU.
    $objProduct->set_name($product['title']); //Set product name.
    $objProduct->set_description($product['description']); //Set product description.
    $objProduct->set_description($product['price']); //Set product price.


    $objProduct->set_category_ids($product['category_ids']); //Set product category ID.

    $objProduct->set_stock_status('instock');
    $objProduct->set_manage_stock(true); //Set true if you want WooCommerce to manage your stock
    $objProduct->set_stock_quantity($product['rating']['count']); //Set product stock qty.
    $objProduct->set_status('publish'); //Set product status

    $productID = $objProduct->save(); //Saving the data to create new product, it will return product ID.
    return $productID;
}

希望这会有所帮助!

参考:

  • 这是 WooCommerce official doc
  • 你也可以参考this article,这里我已经详细解释了如何使用Product CRUD

相关:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 2019-10-14
    • 2019-05-04
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多