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?
Advertisement
Answer
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!