Creación masiva de productos de WooCommerce mediante programación

6 minutos de lectura

¿Es posible crear productos de forma masiva en WooCommerce? Estoy usando el comando Producto wp-cli pero parece que tengo que crear uno por uno.

<?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']}");
}

Esto lleva mucho tiempo ya que hará una consulta para cada producto, peor aún, será un trabajo cron que se ejecutará regularmente. También tengo que verificar si el producto existe, en ese caso, actualizarlo en lugar de crear un nuevo producto.

Entonces el número de consultas se multiplicará por 2.

¿Existe el producto? Actualízalo, de lo contrario, créalo.

¿Hay una mejor manera de hacer esto? Tal vez debería consultar la base de datos directamente, pero se ve sucia.

¿Hay alguna función de WP para consultar la base de datos sin tener que crear mi propia conexión de base de datos?

  • Quiere crear solo usando wp-cli? o una función personalizada servirá? Si es así, puedo responder a su pregunta construyendo con mi esta respuesta.

    – Raunak Gupta

    6 de febrero de 2017 a las 10:26

  • Sí. Cualquier script que cree productos será válido. Incluso la API REST de WooCommerce será válida (probándolo ahora). Comprobaré tu respuesta.

    – Carlos Gocé

    6 de febrero de 2017 a las 11:28

avatar de usuario
Raunak Gupta

Una pequeña nota que había escrito esta respuesta en 2017 en ese momento, la versión de WooCommerce estaba por debajo de <3.0. Asi que si está utilizando WooCommerce versión 3.0. entonces por favor refiérase a esta respuesta.

A partir de marzo de 2022, esta respuesta aún funciona, pero recomendaré usar esta respuesta para > v3.0.

Suponiendo que tiene una matriz como esta y tiene Unique SKU para identificar el producto.

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

Pase la matriz anterior a través de myCustomProduct() método.

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;
}

Esto le dará una breve idea de cómo crear/actualizar el producto; si necesita más ayuda, debe compartir sus 4-5 elementos de matriz, para que pueda saber qué tipo de producto desea crear y qué campo / meta tendrá.

¡Espero que esto ayude!

  • Gracias por la ayuda, pero esto va a ser muy lento. Demasiadas consultas. Ya logré crear productos individuales, el problema es cómo crear productos en fragmentos, por lo que puede importar más de 5000 productos rápidamente sin agregar los productos uno por uno. De lo contrario, tomará demasiado tiempo.

    – Carlos Gocé

    9 de febrero de 2017 a las 9:52

  • Será lento porque WooCommerce no almacena datos en una sola tabla plana, así que como quieras”primero verifique y luego actualice o cree” por lo que tomará tiempo; pero si puede proporcionar algunos datos de muestra, entonces puedo optimizar mi código; es muy difícil decir cuáles son los campos que desea guardar sin ver la matriz.

    – Raunak Gupta

    9 de febrero de 2017 a las 10:13

  • Sí, pero descubrí que WooCommerce tenía un punto final de “productos/lotes” que estaba revisando. Revisé el código fuente para ese punto final y parece que solo itera sobre todos los elementos y llama a create_item en cada uno, no hay optimización para crearlos en lote. Así que creo que me atendría a tu respuesta.

    – Carlos Gocé

    9 de febrero de 2017 a las 10:27

  • ¿Qué pasa con los productos variables?

    – David

    23 de abril de 2020 a las 6:52

  • @RaunakGupta ok, he creado una sala y te he enviado la información que buscas, esperando tu respuesta.

    – Blu3

    19 de marzo a las 15:54

Para WooCommerce versión 3.0 o superior.

Suponiendo que tiene una matriz como esta y tiene Unique SKU para identificar el producto.

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

Pase la matriz anterior a través de wh_myCustomProduct() método.

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;
}

¡Espero que esto ayude!

Referencia:

Relacionada:

  • https://stackoverflow.com/a/71548224/5019802

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad