• Saltar a la navegación principal
  • Saltar al contenido principal
  • Saltar a la barra lateral principal

DecodeCMS

Tu WordPress a otro Nivel ...

  • Acerca de
  • Contacto
  • Inicio
  • Tutoriales
    • Themes
    • Plugins
    • Core
    • Recursos
  • Cursos
  • Acceder
    • Mis cursos
    • Mi Cuenta
    • Acceder
Inicio / Tutoriales / Plugins / Actualizar el stock de productos usando la API de WooCommerce

Actualizar el stock de productos usando la API de WooCommerce

Actualizar el stock de productos usando la API de WooCommerce

[ 11 junio 2020 ] [ Autor: Jhon Marreros Guzmán ][ Plugins - Avanzado] [ ]

funcionalidad librería woocommerce

¿Me ayudas a llegar a más gente?

Twittear Compartir LinkedIn WhatsApp

En algunos proyectos se requiere que una tienda de WooCommerce se integre con algún otro sistema. En este artículo veremos cómo integrar WooCommerce a través de su API para que actualice el stock de productos obtenidos desde un sistema externo.

 

Generalidades

En la siguiente imagen se muestra la estructura general de lo que queremos conseguir, por el lado derecho tenemos la API externa que nos proveerá los datos de origen, estos serán interpretados por código y llevados a la parte izquierda en donde se encuentra nuestra tienda con WooCommerce.

Gráfico estructura general

 

Stock Inicial: Inicialmente tendremos algunos productos que tienen el stock y el precio desactualizado, tal como se muestra en la siguiente imagen.

Lista de productos stock inicial

 
Datos API origen: Vemos que la API extena desde la que obtendremos los datos tiene la información actualizada para estos productos.

Datos servidor externo actualizados

 
Ejecución de código: Al ejecutar el código desde la ventana de comandos veremos que el proceso se realiza correctamente.

Ejecución de código desde la línea de comandos

 
Resultado Final: Al final obtendremos el stock y el precio de los productos de la tienda actualizados.

Lista de productos con stock y precios actualizados

 

Pre requisitos

Tienes que tener en cuenta los siguientes pre requisitos:

  • Una API como origen y que devuelva la información en formato Json, la identificación de los productos es a través del SKU.
  • La API de WooCommerce como destino, Para realizar esto puedes revisar el artículo: Cómo usar la REST API de WooCommerce.
  • Un entorno en donde puedas correr PHP desde la línea de comandos
  • El administrador de dependencias Composer instalado

 

Código para actualizar el stock y precio de productos usando la API de WooCommerce

El siguiente código puedes usarlo como parte de un plugin, como código en un archivo independiente, o ejecutarlo a través de la línea de comandos, tal como vemos en este artículo.

  • Antes de ejecutar el código necesitas instalar las dependencias usando Composer.
  • Puedes descargarte el código completo desde el repositorio de GitHub: Ir al Repositorio

require __DIR__ . '/vendor/autoload.php';
use Automattic\WooCommerce\Client;

// Conexión WooCommerce API destino
// ================================
$url_API_woo = 'https://tuempresa.site/';
$ck_API_woo = 'ck_5fde0679616fe2363980edf8a2061e815682e2ff';
$cs_API_woo = 'cs_992d905e88b2a119fc8e786d181e309d0685a4c0';

$woocommerce = new Client(
    $url_API_woo,
    $ck_API_woo,
    $cs_API_woo,
    ['version' => 'wc/v3']
);
// ================================


// Conexión API origen
// ===================
$url_API="http://localhost:3000/inventory/";

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,$url_API);

echo "➜ Obteniendo datos origen ... \n";
$items_origin = curl_exec($ch);
curl_close($ch);

if ( ! $items_origin ) {
    exit('❗Error en API origen');
}
// ===================


// Obtenemos datos de la API de origen
$items_origin = json_decode($items_origin, true);

// formamos el parámetro de lista de SKUs a actualizar
$param_sku ='';
foreach ($items_origin as $item){
    $param_sku .= $item['sku'] . ',';
}

echo "➜ Obteniendo los ids de los productos... \n";
// Obtenemos todos los productos de la lista de SKUs
$products = $woocommerce->get('products/?sku='. $param_sku);

// Construimos la data en base a los productos recuperados
$item_data = [];
foreach($products as $product){

    // Filtramos el array de origen por sku
    $sku = $product->sku;
    $search_item = array_filter($items_origin, function($item) use($sku) {
        return $item['sku'] == $sku;
    });
    $search_item = reset($search_item);

    // Formamos el array a actualizar
    $item_data[] = [
        'id' => $product->id,
        'regular_price' => $search_item['price'],
        'stock_quantity' => $search_item['qty'],
    ];

}

// Construimos información a actualizar en lotes
$data = [
    'update' => $item_data,
];

echo "➜ Actualización en lote ... \n";
// Actualización en lotes
$result = $woocommerce->post('products/batch', $data);

if (! $result) {
    echo("❗Error al actualizar productos \n");
} else {
    print("✔ Productos actualizados correctamente \n");
}

En el código anterior:

  • La primera parte del código establece la conexión con la API de WooCommerce que será el destino al cual actualizaremos los datos
  • Luego establecemos la conexión para la API de origen, vemos que en los datos de la API de origen tenemos el SKU del producto
  • Puesto que para realizar la ejecución de actualizaciones por lotes necesitamos el ID del producto, entonces antes necesitamos recuperar los productos en base a su SKU
  • Recorremos los productos y vamos formando el array de los datos a actualizar
  • Finalmente realizamos la actualización por lotes

Para entender el proceso por lotes de actualización puedes revisar: Batch updates Products API WooCommerce

 

Conclusión

En algunos proyectos es posible que requieras integrar WooCommerce con otro servicio externo ya sea para actualizar precios o stocks, tal como hemos visto en este artículo puedes hacer esto a través de código usando la API de WooCommerce.

 
¿Aún con dudas?, en el siguiente video se detallan los puntos anteriores.

Suscríbete a DecodeCMS:  

 

¿Me ayudas a llegar a más gente?

Twittear Compartir LinkedIn WhatsApp

Artículos Relacionados

  • Agregar datos a los  endpoints de la API de WooCommerceAgregar datos a los endpoints de la API de WooCommerce
  • REST API WoocommerceCómo usar la REST API de WooCommerce
  • REST API en WordPressCómo usar la REST API de WordPress
  • Campo de texto para escribir en productos WooCommerceCampo de texto para escribir en productos WooCommerce
Valora este artículo : 1 barra2 barras3 barras4 barras5 barras (5 votos, promedio: 5,00 de 5)
Cargando...

Interacciones con los lectores

Comentarios

  1. Claudio Saavedra

    14 julio, 2020

    Estimado.

    Siguiendo su ejemplo no logro actualizar el SRC de la o las imagenes, como se podria hacer?
    Mi código es:

     $item_data[] = [
            'id' => $id_destino,
            'images' => [
                [
                    'src' => $ruta_imagen,
               
                ]
            ],
            'regular_price' => '6',
        ];

    Agradezco su ayuda desde ya

    • Jhon Marreros Guzmán

      14 julio, 2020

      Hola,
      ¿Te aparece algún error?, si el $id_destino y la $ruta_imagen es válido no deberías tener problemas.
      Prueba hacerlo sin batch, es decir actualiza un solo producto, puedes guiarte de: https://woocommerce.github.io/woocommerce-rest-api-docs/#update-a-product

      • Claudio Saavedra

        17 julio, 2020

        Estimado, no me aparece ningún error de hecho logro sacar dos imagenes y en biblioteca de medios quedan adjuntas al producto que corresponde, sin embargo, no las muestra en el producto y no actualiza los demás productos. Usted ha hecho actualización de imagenes de un Woo a otro Woo?

        • Claudio Saavedra

          17 julio, 2020

          Ya encontré el error, resulta que no hace la actualización cuando el producto tiene más de una imagen.
          Cuando el producto tiene una sola imagen no hay problema.

          Que podre hacer??

  2. gerber

    15 julio, 2020

    Intento instalar las dependencias en la terminal de mi macbook pro pero no me deja, me regresa esto
    MacBook-Pro-de-minombre:Update-inventory-WooCommerce-master minombre$ composer install
    -bash: composer: command not found

    • Jhon Marreros Guzmán

      16 julio, 2020

      Hola, tienes que primero instalar Composer

  3. Claudio

    28 julio, 2020

    Increíble tus publicaciones, son muy buenas y útiles, realmente te agradezco mucho. Un saludo y sigue asi porque es excelente el material

    • Jhon Marreros Guzmán

      30 julio, 2020

      Gracias Claudio 🙂

  4. CesarFe

    14 agosto, 2020

    Hola, te consulto como se generan los “Datos API origen” ? Veo que estan en la carpeta ‘data-example’ del archivo .zip que descargo, pero en el codigo de index.php el acceso a los datos origen es http://localhost:3000/inventory/ Como genero ese link en mi pc para poder acceder y verlo como tu ejemplo.
    Jhon aprovecho a decirte GRACIAS por los videos, son geniales y explicados fantasticamente.

    • Jhon Marreros Guzmán

      15 agosto, 2020

      Hola Cesar, gracias, en el ejemplo he usado https://nodejs.org/ como servidor y he instalado este paquete: https://www.npmjs.com/package/json-server , con eso tienes un servidor rápido de pruebas que te devuelve un json.

  5. Marco Castro

    17 agosto, 2020

    buen dia, excelente tutorial, consulta: cuando me da un error “woocommerce_rest_authentication_missing_parameter” a que se debe? he puesto los parametros url_API_woo, ck_API_woo y cs_API_woo de forma adecuada

    • Jhon Marreros Guzmán

      19 agosto, 2020

      Holas estas usando correctamente la librería https://packagist.org/packages/automattic/woocommerce?, revisa primero este artículo y asegúrate de que se conecte correctamente https://decodecms.com/como-usar-la-rest-api-de-woocommerce/

  6. Rama

    8 septiembre, 2020

    Hola lo intento hacer con una conexion sql como origen.

    
    $select_sentence = "SELECT IdArticulo, PrecVBru, Stock_Artic FROM productos";
    $productosSQL = mysqli_query($db, $select_sentence); 
    $productosSQLData = array();
    while($row=$productosSQL->fetch_assoc()){$productosSQLData[] = $row;}
    $param_sku ='';
    foreach ($productosSQLData as $item){$param_sku .= $item['IdArticulo'] . ',';}
    

    Hasta ahi todo bien
    var_dump($param_sku);
    Me devuelve: string(36) “PAI00033,ATL00005,PAI00030,ATL00007,”

    pero la siguente linea
    $products = $woocommerce->get(‘products/?sku=’. $param_sku);
    me devuelve Fatal error:

    Sabes a que se debe?

    Uncaught Automattic\WooCommerce\HttpClient\HttpClientException: Error: Lo siento, no puedes listar recursos. [woocommerce_rest_cannot_view] in C:\xampp\htdocs\UpWoo\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php:350 Stack trace: #0 C:\xampp\htdocs\UpWoo\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php(386): Automattic\WooCommerce\HttpClient\HttpClient->lookForErrors(Object(stdClass)) #1 C:\xampp\htdocs\UpWoo\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php(422): Automattic\WooCommerce\HttpClient\HttpClient->processResponse() #2 C:\xampp\htdocs\UpWoo\vendor\automattic\woocommerce\src\WooCommerce\Client.php(82): Automattic\WooCommerce\HttpClient\HttpClient->request(‘products/?sku=P…’, ‘GET’, Array, Array) #3 C:\xampp\htdocs\UpWoo\index.php(83): Automattic\WooCommerce\Client->get(‘products/?sku=P…’) #4 {main} thrown in C:\xampp\htdocs\UpWoo\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php on line 350

    • Jhon Marreros Guzmán

      9 septiembre, 2020

      Hola, revisa si tienes activas las urls amigables de tu sitios web, desde Ajustes > Enlaces Permanentes, ya que se requiere esto en el get de WooCommerce.

  7. Héctor Angulo

    10 septiembre, 2020

    Tengo el mismo error:
    ➜ Obteniendo datos origen … ➜ Obteniendo los ids de los productos…
    Fatal error: Uncaught Automattic\WooCommerce\HttpClient\HttpClientException: Error: Lo siento, no puedes listar recursos. [woocommerce_rest_cannot_view] in /home/customer/www/kariokids.com/public_html/conector/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/HttpClient.php:350 Stack trace: #0
    Me ha dado varios problemas, en un hosting vps dreamhost no conecto la API (no abre) y no tengo acceso a la configuración. Ahora estoy probando ahora en un siteground y abrió la API, pero me sale el mismo error del amigo anterior, esto con la versión wp 5.5.1 wc 4.5.1. Ayer u hoy hubo un update de WC

    Alguna idea?

    • Jhon Marreros Guzmán

      11 septiembre, 2020

      Hola, usualmente sale porque no tienes las urls amigables configuradas, pero podría ser también alguna configuración de servidor, revisa por ejemplo: https://github.com/woocommerce/wc-api-php/issues/261

  8. vivi

    11 septiembre, 2020

    hola, tengo un caso en el que la api de origen que genera la información se encuentra en un servidor que requiere autentificarse.

    • Jhon Marreros Guzmán

      11 septiembre, 2020

      Hola, tendrías que generar entonces antes el token de autenticación y luego seguir el proceso, en la documentación de tu API debería especificarse cómo realizar esto.

  9. Amadeus

    20 septiembre, 2020

    Hola solo quiero pasar esto [{“regular_price”:”75,83″,”sku”:”codX1″,”stock_quantity”:300,”sale_price”:”81,85″}]
    desde mi data de origen y me da error.
    ➜ Obteniendo datos origen … ➜ Obteniendo los ids de los productos…
    Fatal error: Uncaught Automattic\WooCommerce\HttpClient\HttpClientException: Error: [] in C:\xampp\htdocs\ClientephpWoocomerce\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php:350 Stack trace: #0 C:\xampp\htdocs\ClientephpWoocomerce\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php(386): Automattic\WooCommerce\HttpClient\HttpClient->lookForErrors(Object(stdClass)) #1 C:\xampp\htdocs\ClientephpWoocomerce\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php(422): Automattic\WooCommerce\HttpClient\HttpClient->processResponse() #2 C:\xampp\htdocs\ClientephpWoocomerce\vendor\automattic\woocommerce\src\WooCommerce\Client.php(82): Automattic\WooCommerce\HttpClient\HttpClient->request(‘products/?sku=c…’, ‘GET’, Array, Array) #3 C:\xampp\htdocs\ClientephpWoocomerce\actualizarWoo.php(50): Automattic\WooCommerce\Client->get(‘products/?sku=c…’) #4 {main} thrown in C:\xampp\htdocs\ClientephpWoocomerce\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php on line 350
    Ya verifique las Url amigables y todo ese tema.
    cual podra ser el problema?
    gracias excelente vídeo y explicación

    • Jhon Marreros Guzmán

      22 septiembre, 2020

      Hola, hay un problema en la obtención de los IDs, posiblemente tengas problemas de acceso a la API, revisa este artículo de base, ya que primero tienes que asegurarte de que puedas al menos leer los productos.

      Saludos.

  10. Jorge Morales

    29 septiembre, 2020

    Gracias por tu post, me ha sido de muchísima ayuda!!!

    Estoy trabajando con una gran cantidad de productos, alrededor de 4000….
    Haciendo una modificación a tu código logré obtenerlos desde woocommerce haciendo uso de la paginación.

    El problema es que no puedo actualizar los productos con “batch” me da un error 500… ¿Alguna idea? y nuevamente gracias por tu explicación….

    • Jhon Marreros Guzmán

      2 octubre, 2020

      Hola, prueba actualizarlos de 100 en 100, ya que al parecer el batch no te aceptará 4000.
      Saludos.

  11. Norbey

    8 octubre, 2020

    Hola
    $products = $woocommerce->get(‘products’); cuando realizo la consulta al woocomerce solo me arroja 10 productos. esto tiene algun limite y cómo hago para que me arroje toda la información

    • Jhon Marreros Guzmán

      9 octubre, 2020

      Hola, eso es debido a la configuración de productos por página, revisa la documentación de la API de WooCommerce: https://woocommerce.github.io/woocommerce-rest-api-docs/#list-all-products

      • norbey Martinez

        9 octubre, 2020

        Estuve leyendo y esta esta opción per_page
        se la estoy enviando como parametros desde la autenticación de la siguiente forma

        true,
        ‘wp_api’ => true,
        ‘version’ => ‘wc/v1’,
        ‘per_page’ => ’60’,
        ‘page’ => ‘5’

        ]
        );

        pero no me funciona, estoy realizando algo mal?

        • Jhon Marreros Guzmán

          10 octubre, 2020

          Hola, usa la version 3 de la API, tienes más de 300 productos?, mejor prueba sólo con la primera página.

  12. Hector

    9 octubre, 2020

    He revisado cada linea de codigo y funcionan haciendo un print_r el proceso no falla y segun las sentencias actualiza pero al entrar al producto sigue la misma información active las url amigables, recorri los arrays y si me muestra los productos.

  13. norbey

    13 octubre, 2020

    Hola, tengo productos que tienen variación y otros que no, como puedo consultar todo en una sola consulta?

    • Diego Malqui

      10 agosto, 2021

      Buen dia.. pudiste resolver este tema?

  14. José Rojas

    20 octubre, 2020

    Hola Jhon, mi pregunta es simple. Cómo puedo hacer esto mismo pero con otra API de Woocommerce? Me refiero a que dos Woocommerce se sincronicen en stock mediante este mismo código. También me gustaría saber cómo hacerlo con otra API que necesita autentificación. Gracias

    • Jhon Marreros Guzmán

      22 octubre, 2020

      Hola, podrías evaluar un plugin ya que tienes esta funcionalidad ya realizada, evalúa por ejemplo: https://es.wordpress.org/plugins/stock-sync-for-woocommerce/

  15. Marrero Eduardo

    30 octubre, 2020

    Hola Jhon nunca habias escuchado tu apellido es raro soy soy Marrero sin S :-), bueno queria preguntarte si me puedes dar un idea de como puede saber desde la api si hubo cambios por ejemplo: En la tabla de clientes si un usuario cambio su telefono, de que manera con un consulta api rest puedo saber que hubo un cambio en tabla para, no estar revisando regitros por restigro, para saber si hubo algun cambio, No se si me explique?

    • Jhon Marreros Guzmán

      30 octubre, 2020

      Hola, jeje, enhorabuena por los apellidos similares 🙂
      Con respecto a lo que comentas, para que no revises toda la data revisa si se guarda alguna fecha de modificación en el registro, sino tienes este dato, entonces cada vez que se haga un cambio en un cliente tendrías que guardar algún log en alguna otra tabla o como metadato, de manera que puedas consultar sólo estos que cumplen esta condición.

  16. Juan Marcano

    2 noviembre, 2020

    Buenos días Jhon; estoy haciendo una aplicación para recuperar datos de un producto y generar un pdf, ya tengo la conexión por medio de API RES, ya tengo como generar el PDF, lo que me hace falta es recuperar los datos de un producto en específico según la url con el id del producto. Un ejemplo de lo que quiero hacer esta en: https://www.clinicahernancortes.com/meditickets/brackets-de-zafiro/ que cuando le das al botón (Descargar e imprimir PDF) te genera el pdf según los datos de ese producto y el link del botón seria algo como (https://www.clinicahernancortes.com/pdf/meditickets.php?p=1840) Quisiera conversar contigo via telefónica para que me ayudaras con esto; claro! cobrando tus honorarios correspondientes. Lo que me falta del código PHP es muy poco, te pasaría el código de como esta realizado en https://www.clinicahernancortes.com/meditickets/ para adaptarlo al mío.

    Espero su respuesta,

    Saludos;

    • Jhon Marreros Guzmán

      4 noviembre, 2020

      Hola Juan,
      Escríbeme a través del formulario de contacto: https://decodecms.com/contacto/

  17. HCordero

    3 noviembre, 2020

    Logro realizar la actualizacion de productos pero cuando un producto tiene variacion no me actualiza la variacion al hacer un var_dum($result) me muestra lo siguiente: ( [update] => Array ( [0] => stdClass Object ( [id] => 185 [error] => stdClass Object ( [code] => woocommerce_rest_invalid_product_id [message] => Para manipular variaciones de producto deberías usar la variable /products///variations/ [data] => stdClass Object ( [status] => 404 ) )

    Alguna orientacion donde debo modificar para actualizar los productos con variacion?

    • Jhon Marreros Guzmán

      4 noviembre, 2020

      Hola, el propio mensaje te indica la ruta que debes usar, igual te sugiero revisar: https://woocommerce.github.io/woocommerce-rest-api-docs/#product-variations

  18. Javier

    7 noviembre, 2020

    Hola Jhon como va todo, puede ser que el codigo ya no funcione? estuve probandolo pero me sale el siguiente error:
    Fatal error: Uncaught Automattic\WooCommerce\HttpClient\HttpClientException: JSON ERROR: Syntax error in D:\portables\xampp2\htdocs\inventario\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php:378 Stack trace: #0 D:\portables\xampp2\htdocs\inventario\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php(422): Automattic\WooCommerce\HttpClient\HttpClient->processResponse() #1 D:\portables\xampp2\htdocs\inventario\vendor\automattic\woocommerce\src\WooCommerce\Client.php(82): Automattic\WooCommerce\HttpClient\HttpClient->request(‘products/?sku=R…’, ‘GET’, Array, Array) #2 D:\portables\xampp2\htdocs\inventario\index.php(49): Automattic\WooCommerce\Client->get(‘products/?sku=R…’) #3 {main} thrown in D:\portables\xampp2\htdocs\inventario\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php on line 378
    ➜ Obteniendo datos origen …
    ➜ Obteniendo los ids de los productos…

    • Jhon Marreros Guzmán

      7 noviembre, 2020

      Hola, revisa la siguiente discusión, ya que el error no es tan claro, hay diferente alternativas de solución que se discuten en este enlace: https://github.com/woocommerce/wc-api-php/issues/247

  19. Javier

    7 noviembre, 2020

    perfecto, aunque no me sirvio las soluciones de ese foro, esta si funciono y filtra supuestamente
    para verificar hice un print_r a la variable $products para ver que se llene con el filtro
    esto es lo que reemplace
    $products = $woocommerce->get(‘products’, [‘sku’ => $param_sku]); ahi si funciona hasta ese punto pero hice un count() para ver cuantos items devolvia el filtro, y solo son 10 el limite que tiene por defecto la api,
    y tengo 59 productos simples que por lo menos deberia mostrar esa cantidad filtrada,
    ahora aparte de filtrar solo 10 siguiente paso me da el error que te muestro:
    Notice: Trying to access array offset on value of type bool in D:\portables\xampp2\htdocs\inventario\index.php on line 69
    Notice: Trying to access array offset on value of type bool in D:\portables\xampp2\htdocs\inventario\index.php on line 70
    se repite 7 veces, corresponde a las lineas
    ‘regular_price’ => $search_item[‘price’], //linea 69
    ‘stock_quantity’ => $search_item[‘qty’], //linea 70
    y sigue hasta el final mostrando el mensaje de actualizado correctamente pero no actualizo nada

  20. Estuardo

    14 noviembre, 2020

    Muy bien explicado! Excelente Tutorial 💪, solo con una pregunta, no tendrás algun ejemplo de como subir los productos con variaciones? He leído e intentado siguiendo la documentación de woocommerce pero no lo he logrado :/

    • Jhon Marreros Guzmán

      16 noviembre, 2020

      Hola, tomo nota de esto, ya que no lo he probado con variaciones, posiblemente actualice o haga un artículo sobre esto proximamente. Saludos.

  21. Marco Gonzalez

    15 noviembre, 2020

    Primero que nada muchas gracias por tus aportes, tengo un problema quiero hacer lo mismo que haces con una Api Rest de un Proveedor mio, pero el tema es que me sale el siguiente error:

    Notice: Trying to access array offset on value of type int in C:\Users\Sescom\Desktop\Update-inventory-WooCommerce-master\Update-inventory-WooCommerce-master\index.php on line 56

    Linea 56: $param_sku .= $item[‘modelo’] . ‘,’;

    asi viene el ‘sku’ en la Api de mi proveedor, pero me parece que esta en un segundo nivel como lo siguiente:

    {“cantidad”:6281,”pagina”:1,”paginas”:105,”productos”:[{“producto_id”:”20451″,”modelo”:”KDP-601A1M\/MS2D”,”total_existencia”:198,…………………..

    Espero me puedas ayudar, te lo agradeceria mucho

    • Jhon Marreros Guzmán

      16 noviembre, 2020

      Hola, utiliza $items_origin[‘productos’], ya que te interesa acceder a los productos.

      • Marco Gonzalez

        18 noviembre, 2020

        Ahora me sale este error:

        PHP Notice: Array to string conversion in C:\Users\Sescom\Desktop\Update-inventory-WooCommerce-master\Update-inventory-WooCommerce-master\index.php on line 55

        Se que el tiempo es valioso, me gustaría saber si me podrías vender una asesoría ya sea vía teamviewer o anidesk, para poder resolver este tema y poder utilizar esta Api Rest, te agradezco tu atención, saludos

  22. Juan

    16 noviembre, 2020

    hola jhon estoy implementando este metodo y creo que tengo problemas con https ya que estoy haciendo pruebas en desarrollo con http y me da este mensaje que debo hacer para poder hacer la actualizacion de productos con http?

    este es el mensaje de error :
    Fatal error: Uncaught Automattic\WooCommerce\HttpClient\HttpClientException: Error: Missing OAuth parameter oauth_consumer_key [woocommerce_rest_authentication_missing_parameter] in /Applications/MAMP/htdocs/wordpress/wp-content/plugins/api/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/HttpClient.php:350

    • Jhon Marreros Guzmán

      16 noviembre, 2020

      Hola, revisa la siguiente discusión, prueba poniendo el parámetro ‘verify_ssl’ => false , en la definición del objeto Client. https://github.com/woocommerce/wc-api-php/issues/22

      • Juan

        20 noviembre, 2020

        hola jhon gracias aunque no queria tomarme esa opcion de ‘verify_ssl’ => false igual me daba error tuve que montar un server de wordpress con https y ahi si pude , probe y todo bien , lo malo es que ahora me sale error ya que necesito actualizar una gran cantidad de productos, ya lei en el foro que debo darle paginacion para poder actualizar de 100 en 100 pero igual me da error , sabes de algun sitio en el que pueda buscar informacion sobre como hacerlo con una gran cantidad de productos? ya que trato de paginar y no logro

    • Miguel Benitez

      22 noviembre, 2021

      Saludos Amigo.

      ¿Lograste resolver este invonveniente?

  23. Valentina

    26 noviembre, 2020

    Hola Jhon, una consulta, este metodo seria para correrlo manualmente y local, no? Se puede automatizar en el servidor de WP directamente?
    Muchas gracias!

    • Jhon Marreros Guzmán

      27 noviembre, 2020

      Hola, si, sería similar en un servidor, si quieres integrarlo con WordPress, sería construir un plugin, en el servidor puedes programar un cron igualmente para que sea cada X tiempo.

  24. Darlin Sanchez

    4 diciembre, 2020

    Hola buen día Estimado, Gracias por el tutorial, quería saber si es posible obtener los datos de un arreglo y no de un json en ejecución. gracias de antemano

    Saludos,

    • Jhon Marreros Guzmán

      5 diciembre, 2020

      Hola, si, claro, si ya tienes los datos en un arreglo sería mucho más práctico ya que llenarías directamente la variable $items_origin a la que hago referencia.

  25. Christian

    5 enero, 2021

    Buenas, tengo un problema, me finaliza el proceso pero no se actualizan los datos en mi pagina, sabrias cual podria ser mi error con respecto a eso?

    • Jhon Marreros Guzmán

      6 enero, 2021

      Hola, difícil saberlo, ve depurando con el error_log, prueba igualmente en otro sitio de ejemplo y verifica si te sucede lo mismo.

  26. Matías Ochoa

    1 febrero, 2021

    Muy buena explicación, Jhon.
    Tengo una duda. Tengo un cliente con una tienda online que trabaja con un gran proveedor. Este proveedor nos envía un excel de carga de productos. Y nos comenta que debemos enlazar su API una vez al día para actualizar los precios de productos.

    ¿Cómo debo hacerlo?
    —
    Ellos me dan la siguiente indicación, pero no entiendo cómo proceder.

    -Añadir cabecera Authorization con tu token
    -Endpoint: https://api.horturc.es/products/download-woocommerce-csv
    -Método: GET
    -Parámetros en query (en este caso, al ser get, los parámetros van en la query):
    -URL final: https://api.horturc.es/products/download-woocommerce-csv?type=complete&file=products&category=8
    —
    Muchas gracias.
    Saludos.

    • Jhon Marreros Guzmán

      2 febrero, 2021

      Hola, primero valida los datos que te dan, puedes usar alguna aplicación como Postman para esto, tienes que tener el token de autenticación posiblemente para pasarlo en la cabecera de la petición. Una vez que pruebes con Postman entonces podrás implementarlo más fácilmente en PHP.

  27. Marlon

    1 marzo, 2021

    buenos dias si serviria este codigo para actualizar mas de 1000 productos no me daría problemas

    • Jhon Marreros Guzmán

      2 marzo, 2021

      Hola, si usas batch esta limitado a 100 productos u objetos, tendrías que ejecutarlo en varias veces o programar algún cron.

  28. Carlos

    12 marzo, 2021

    $products = $woocommerce->get(‘products/?sku=’. $param_sku);
    Hola Jhon, gracias por el aporte
    Disculpa la ruta del get en esa linea es la misma para todos? o cambia?
    Es que el proceso se detiene justo en esa línea

    • Jhon Marreros Guzmán

      16 marzo, 2021

      Hola, $param_sku tiene que tener los SKUs separados por comas, prueba con solo algunos productos y verifica.

  29. Adrian

    24 marzo, 2021

    Buen dia Jhon
    Podrias ayudarme si no es mucho molestia tal vez con un ejemplo?
    La respuesta que obtengo de la API de origen esta paginada, cada pagina tiene 60 productos, que a su vez estos productos los campos que necesito para formar el array para actualizar están hasta 5 arreglos dentro del arreglo principal.

    • Jhon Marreros Guzmán

      25 marzo, 2021

      Hola
      Es mejor hacerlo por lotes, en tu caso sería de 60 en 60, puedes programar un cron por ejemplo para que la actualización se haga cada X tiempo. Lo de los arreglos, tendrías que recorrerlos hasta ubicar el dato que quieres, lógicamente con la información que me das no puedo darte detalle. Saludos.

  30. Dayana

    25 marzo, 2021

    Hola
    Tengo cerca de 2000 productos en mi web , pero solo se actualizan los 100 ultimos, que son los que recupero por página, no lo gro hacer una paginación , me puedes indicar como actualizar los restantes productos ???, muchas gracias

    • Jhon Marreros Guzmán

      30 marzo, 2021

      Hola, la actualización por batch, efectivamente sólo permite 100 productos a la vez, tendrías que realizar una lógica de ejecución que vuelva llamar el batch o ejecutarlo a través de un cron.

  31. Carlos

    29 marzo, 2021

    Amigo el script me funciona bien, pero no se por qué me está actualizando el mismo valor de las cantidades, para todos los items es el mismo valor, sabes por que puede ser? Gracias
    ➜ Obteniendo datos origen …
    ➜ Obteniendo los ids de los productos…
    array(49) {
    [0]=>
    array(2) {
    [“id”]=>
    int(7915)
    [“stock_quantity”]=>
    string(2) “30”
    }
    [1]=>
    array(2) {
    [“id”]=>
    int(7914)
    [“stock_quantity”]=>
    string(2) “30”
    }
    …

    • Adrian

      30 marzo, 2021

      Buen dia Carlos, parece que estamos trabajando con el mismo proveedor.
      Si gustas podemos intercambiar codigos

  32. Carlos

    30 marzo, 2021

    Hola Angel, con gusto, hice unos cambios en la api de origen para poder paginar por lotes de 100, si te sirve de algo, te paso ese fragmento del código en php… El resto del código de Jhon sigue siendo el mismo, alguno que otros cambios en nombres de variables. si necesitas algo sobre la paginación, estoy atento…

    De mi parte si me gustaría solucionar lo de la variable cantidad que solo me trae un mismo valor para todos los productos.

    Saludos

    • Adrian

      30 marzo, 2021

      Hola Carlos. Si me gustaría que me compartieras ese fragmento de código.
      tal vez viéndolo podamos resolver que te ponga la misma cantidad en todos los productos.
      Te dejo mi mail(espero que si se pueda compartir)
      acortes@conmujal.com

    • Fernando

      3 abril, 2021

      Hola Carlos, me puedes por favor pasar el código para paginar lotes de 100 en 100?. También tengo el inconveniente para poder enviar más de 100 registros. Muchas gracias.

  33. Carlos

    5 abril, 2021

    Hola Adrian y Fernando

    Teniendo todos los registros desde la fuente principal,
    En mi caso obtengo el sku, y stock de la api de mi proveedor, los guardo en una tabla aparte en la BBDD para luego consultarlos por lotes de 100 con una simple consulta sql

    Teniendo los datos almacenados en la tabla, consultas los registros y con el paginador le mandas los lotes al archivo de John

    Archivo: stock.php
    query(‘SELECT sku,cantidad FROM nombre-tabla LIMIT ‘.$start_from.’,’.$num_per_page.”);

    while($filaqrySku = mysqli_fetch_array($rsqrySku)) $array[] = $filaqrySku;
    $json = json_encode($array);
    echo $json;

    Resultado:
    [
    {
    “id”: “1”,
    “sku”: “14005”,
    “cantidad”: “0”
    },
    {
    “id”: “2”,
    “sku”: “16415”,
    “cantidad”: “394”
    },
    {
    “id”: “3”,
    “sku”: “16401”,
    “cantidad”: “14”
    }
    ]

    Y CONTINUAMOS TAL CUAL EN EL ARCHIVO DE JOHN, DONDE ESTA LA URL DE ORIGEN COLOCAR COMO ENDPOINT ?page=14
    Ejemplo:

    // Conexión API origen
    // ===================
    $page = $_GET[‘page’];
    $url_API=”https://tu-url/Update-inventory-WooCommerce-master/api-stock.php?page=14″;

    En mi caso son 14 paginas, en el end point colocas el nro a consultar
    Igual tuve que hacer un cron job para cada pagina y de esa forma se ejecutan automáticamente cada 12 hras

    Saludos

  34. Alex

    21 abril, 2021

    Hola,

    Sería muy descabellado hacerlo desde un excel? Tengo un proceso que ya me sube un archivo en .xlsx con todos los datos a una url en la misma raiz de la web.

    Un saludo.

    • Jhon Marreros Guzmán

      21 abril, 2021

      Hola, en este caso no sería necesario usar la API de WooCommerce, simplemente usa algún plugin que te importe archivos desde un .csv o un excel desde una ruta de tu hosting. Si quieres hacerlo por programación tendrías que usar las funciones de WooCommerce, pero no es necesario usar la API ya que estas en el mismo hosting.

  35. Daniel

    22 abril, 2021

    Hola ! ya tengo actualizados los productos de mi base de datos externa dentro del woocoomerce. Que pasa una persona realiza una compra de un producto; la información del valor, quien hizo la compra y demás datos deberian retornar a la base de datos externa. Como se podría hacer eso ? o sea q se actualice la información viceversa.

    • Jhon Marreros Guzmán

      22 abril, 2021

      Hola, en este caso tu sistema tendría que tener una API de escritura para actualizar esos datos.
      Tendrías que hacer un plugin complementario para WooCommerce que para ciertos Hooks (el hook de orden completada), actualice datos a la API de tu sistema externo.
      Saludos.

  36. Martin

    30 abril, 2021

    Hola Jhon..
    Al momento de actualizar el stock de productos, si hay clientes comprando y en sus carros de compras tiene productos con cantidades…. esas cantidades se setean a cero.. haciendo que los clientes deban volver a modificar la compra… ese comportamiento será por defecto?

    • Jhon Marreros Guzmán

      3 mayo, 2021

      Hola, no se establece a cero, el proceso sigue, en la parte final si no hay stock, la compra falla y ya no permite seguir, aparecerá un mensaje de stock.

  37. Erick Osorio

    13 mayo, 2021

    Como puedo crear múltiples productos en una sola vez ya que no logro hacerlo, solo puedo crear uno solo a la vez para mi lógica de mi sistema me conviene crear muchos productos en un par de clicks

    • Jhon Marreros Guzmán

      15 mayo, 2021

      Hola, revisa la sintaxis de Batch Product, verás que hay una parte de creación: https://woocommerce.github.io/woocommerce-rest-api-docs/#batch-update-products

  38. Mihaela

    18 mayo, 2021

    Can you do this for me?
    For a fee, of course

    • Jhon Marreros Guzmán

      19 mayo, 2021

      You can contact me from this url: https://decodecms.com/contacto/

  39. Enrique

    9 octubre, 2021

    Excelente articulo, me ayudó mucho. Gracias, esto sin duda me puso en la dirección correcta para resolver la actualización de stock.

    Una duda. ¿hay forma de ver un log o registro de los cambios o productos actualizados?

    • Jhon Marreros Guzmán

      11 octubre, 2021

      Hola, no hay un log, posiblemente tengas que crearlo, puedes usar la función error_log() de PHP para esto. Revisa este artículo de referencia: https://decodecms.com/depurar-codigo-php-en-wordpress/

  40. Antrim

    10 octubre, 2021

    Excelente tutorial, valiosisimo!
    Me puedes ayudar con un ejemplo para ver la paginacion o para actualizar un catalogo de 900 productos?

    Gracias de antemano, John, qué barbaro!

    • Jhon Marreros Guzmán

      11 octubre, 2021

      Hola, es algo que tengo pendiente, espero actualizar o hacer un artículo nuevo sobre esto. De manera general tendrías que ir variando el parámetro de página, revisa: https://woocommerce.github.io/woocommerce-rest-api-docs/#list-all-products

  41. Alejandro

    21 octubre, 2021

    Hola Jhon, me funciona todo a la perfección, pero tengo el problema que no me trae mas de 10 productos.
    He probado 2 cosas:
    Poner esto:
    $products = $woocommerce->get(‘products/ , array( ‘per_page’ => 100 ));
    y me trae los 24 productos
    y esto:
    $products = $woocommerce->get(‘products/?sku=’. $param_sku , array( ‘per_page’ => 100 ));
    que me trae solo 10 resultados cuando deberían ser los 24 porque coinciden los SKU.
    Que estaré poniendo mal?
    Desde ya agradecido.

  42. Alejandro

    22 octubre, 2021

    Buen día, lo solucione de esta forma:

    $products = $woocommerce->get('products/?per_page=100&sku='. $param_sku);
    

    Saludos.

    • Jhon Marreros Guzmán

      22 octubre, 2021

      Gracias por el aporte. Saludos.

  43. Francisco Ortega

    27 diciembre, 2021

    Saludos amigo, gracias por el aporte funciona perfecto, excto que no actulaiza los productos variables, podrias ayudarme que esta fallando..? Gracias…

    • Jhon Marreros Guzmán

      28 diciembre, 2021

      Hola, evaluaré hacer un artículo sobre cómo hacer la actualización de productos variables. Mientras tanto te sugiero revisar la documentación: https://woocommerce.github.io/woocommerce-rest-api-docs/#product-variations

  44. Pablo Rumie Vittar

    27 diciembre, 2021

    Hola Jhon! Que interesante artículo que planteas acá, gracias! Te cuento que estoy desarrollando una tienda que sincroniza en tiempo real con otra (WooCommerce -> WooCommerce) pero la tienda fuente, debe recibir la información desde un mayorista que exporta su información mediante su webService y genera su propio JSON. Es posible de la manera que planteas poder tomar esos datos y volcarlos a la tienda fuente, para que luego ésta replique al resto? Podría contactarme contigo para contratar tus servicios? SALUDOS!

    • Jhon Marreros Guzmán

      28 diciembre, 2021

      Hola, si, tendrías posiblemente que hacer un plugin que lea los datos externos, puedes contactarme desde: https://decodecms.com/contacto/

  45. Gustavo Yuquilima

    22 enero, 2022

    Hola Jhon! Còmo puedo hacer para que el mètodo ->get(‘products’), me devuelva ciertos atributos del producto no todas las columnas

    • Jhon Marreros Guzmán

      26 enero, 2022

      Hola, según la documentación, no es posible, tendrías que hacer tu propio EndPoint que te devuelva los campos de acuerdo a tus necesidades.

  46. Quique

    27 enero, 2022

    Sabes como puedo poner el cronjob desde cpanel? Veo que no tiene composer instalado

    • Jhon Marreros Guzmán

      27 enero, 2022

      Hola, para el Cron, revisa: https://decodecms.com/tareas-automaticas-con-wp-cron-en-wordpress/ , para composer, mejor trabaja de manera local, de esta forma sólo subirás los archivos y composer directamente al servidor.

  47. Gustavo Yuquilima

    28 enero, 2022

    Estoy actualizando stock y precio, no me devuelve ningun mensaje de error pero al cosnultar el producto en la tienda veo que no se ha actualizado el stock, si lo hago uno por uno si se actualiza

  48. Gustavo Yuquilima

    28 enero, 2022

    Estoy actualizando stock y precio, no me devuelve ningun mensaje de error pero al consultar el producto en la tienda veo que no se ha actualizado el stock, si lo hago uno por uno si se actualiza.
    Debo aplicar sleep(10); entre cada iteraciòn, son 2000 productos los envio en bloques de 50 registros

  49. Daniela Belen

    5 mayo, 2022

    Estimado, desde ya muchas gracias por tu trabajo. Te cuento yo tengo que actualizar dos tiendas de woocommerce entre si, pero solo el stock sin el precio. Y quería saber como lo puedo hacer puglin directamente, Desde ya agradezco tu respuesta, saludos

    • Jhon Marreros Guzmán

      8 mayo, 2022

      Hola, evaluaré profundizar en ese tema de sincronización de stock y precios en un curso.

  50. Henry Marca

    8 julio, 2022

    Buenas estimado, tu trabajo me esta ayudando muchísimo en la actualización de los productos de mi sitio, lo estoy haciendo un poco diferente al tuyo, ya que en lugar de consultar todos los productos que están en la cadena de sku los consulto uno por uno ya que son 2000 productos el problema esta en que al llegar a la consulta 1230 sale el siguiente error

    PHP Fatal error: Uncaught Automattic\WooCommerce\HttpClient\HttpClientException: cURL Error: HTTP/2 stream 0 was not closed cleanly: Unknown error code (err 1) in C:\Proyectos\ApiUpdate\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php:450
    Stack trace:
    #0 C:\Proyectos\ApiUpdate\vendor\automattic\woocommerce\src\WooCommerce\Client.php(82): Automattic\WooCommerce\HttpClient\HttpClient->request(‘products/?sku=M…’, ‘GET’, Array, Array)
    #1 C:\Proyectos\ApiUpdate\prueba.php(57): Automattic\WooCommerce\Client->get(‘products/?sku=M…’)
    #2 {main}
    thrown in C:\Proyectos\ApiUpdate\vendor\automattic\woocommerce\src\WooCommerce\HttpClient\HttpClient.php on line 450

    podrías echarme una mano para solucionar esto, muchas gracias.

    • Jhon Marreros Guzmán

      8 julio, 2022

      Hola, posiblemente tenga que ver con el tiempo de ejecución que tienes configurado en PHP, prueba incrementar el max_execution_time de PHP, aqui también comentan otras soluciones: https://github.com/woocommerce/wc-api-php/issues/261

  51. Alfredo Sánchez

    2 diciembre, 2022

    Buenos días Jhon. Necesito sincronizar mi tienda woocommerce con un proveedor externo. He seguido los pasos del tutorial y al ejecutar el index.php me aparece esto:

    Obteniendo datos origen …
    PHP Warning: foreach() argument must be of type array|object, null given in C:\Users\alfre\OneDrive\Escritorio\Update-inventory-WooCommerce-master\index.php on line 43

    Mis conocimientos sobre esto son muy pocos y te agradecería si pudieras guiarme hacía donde está el fallo. Un saludo.

    • Jhon Marreros Guzmán

      5 diciembre, 2022

      Hola Alfredo.
      Es como si estuvieras recorriendo un array vacío, asegúrate de tener datos de origen. Espero pronto sacar un curso detallando estos temas de conexión con API.

Para escribir código envolver con: <pre class="language-xxx"><code> </code></pre> ,reemplaza las xxx (php, css, html)

*

* Gravatar habilitado

Barra lateral principal

Presentación

Curso Decodifica WordPress

Únete a DecodeCMS

Recibirás como regalo:

Guia práctica con video:
¿Quieres agregar código a WordPress? Revisa las diferentes opciones que tienes.Ver más

Jooble
Alojamiento Wordpress

Niveles

Básico Intermedio Avanzado

Etiquetas

accesibilidad css dashboard editor error funcionalidad herramientas imagen js librería mejoras optimización seguridad social woocommerce

Populares

Añadir código de Google Analytics sin plugins en WordPress

Productos de ejemplo en WooCommerce

Agregar redes sociales en la cabecera de WordPress

Mostrar mensajes en la administración de WordPress y en Gutenberg

© logo decode pie
Política de Privacidad | Política de devoluciones
Copyrigth 2023 Todos los derechos reservados