'Bulk create WooCommerce products programmatically
It is possible to bulk create products on WooCommerce? I am using the wp-cli Product command but it seems that I have to create one by one.
<?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']}");
}
This takes a lot of time since it is going to make a query for each product, even worse, it is going to be a cron job that will be run regularly. I also have to check if the product exist, in that case, update it instead of create a new product.
So the number of queries will be multiplied by 2.
Product Exists? Update it, else Create it
Is there a better way to do this? Maybe I should query the database directly, but it looks dirty.
Is there any WP function to query the database without having to create my own DB connection?
Solution 1:[1]
A small note I had written this answer way back in 2017 at that time WooCommerce version was below < 3.0. So if you are using WooCommerce version 3.0. then please refer to this answer.
As of March 2022 this answer still works but I will recommend using this answer for > v3.0.
Assuming you have an array like this and you have Unique SKU to identify product.
$products = [
0 => [
'title' => 'My Simple product 1',
'sku' => 'sku1',
'product_cat' => 'My cat'
//...
//...
],
1 => [
'title' => 'My Simple product 1',
'sku' => 'sku1'
//...
//...
]
];
Pass the above array through myCustomProduct() method.
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;
}
This'll give you a brief idea as how to create/update product; if you need any further assistance then you have to share your 4-5 array elements, so that I can get to know what type of product you want to create and what field/meta it will be having.
Hope this helps!
Solution 2:[2]
For WooCommerce Version 3.0 or above.
Assuming you have an array like this and you have Unique SKU to identify product.
$products = [
0 => [
'title' => 'My Simple product 1',
'sku' => 'sku1',
'category_ids' => [23,45]
//...
//...
],
1 => [
'title' => 'My Simple product 1',
'sku' => 'sku1'
//...
//...
]
];
Pass the above array through wh_myCustomProduct() method.
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;
}
Hope this helps!
Reference:
- This is the WooCommerce official doc
- You can also refer to this article where I have explained in detail how to use Product CRUD
Related:
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Raunak Gupta |
