phpwordpresswoocommercewp-cli

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

  • 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!