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.
Stock Inicial: Inicialmente tendremos algunos productos que tienen el stock y el precio desactualizado, tal como se muestra en la siguiente imagen.

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

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

Resultado Final: Al final obtendremos el stock y el precio de los productos de la tienda 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
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.
Estimado.
Siguiendo su ejemplo no logro actualizar el SRC de la o las imagenes, como se podria hacer?
Mi código es:
Agradezco su ayuda desde ya
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
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?
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??
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
Hola, tienes que primero instalar Composer
Increíble tus publicaciones, son muy buenas y útiles, realmente te agradezco mucho. Un saludo y sigue asi porque es excelente el material
Gracias Claudio 🙂
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.
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.
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
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/
Hola lo intento hacer con una conexion sql como origen.
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
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.
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?
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
hola, tengo un caso en el que la api de origen que genera la información se encuentra en un servidor que requiere autentificarse.
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.
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
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.
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….
Hola, prueba actualizarlos de 100 en 100, ya que al parecer el batch no te aceptará 4000.
Saludos.
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
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
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?
Hola, usa la version 3 de la API, tienes más de 300 productos?, mejor prueba sólo con la primera página.
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.
Hola, tengo productos que tienen variación y otros que no, como puedo consultar todo en una sola consulta?
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
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/
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?
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.
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;
Hola Juan,
Escríbeme a través del formulario de contacto: https://decodecms.com/contacto/
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?
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
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…
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
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
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 :/
Hola, tomo nota de esto, ya que no lo he probado con variaciones, posiblemente actualice o haga un artículo sobre esto proximamente. Saludos.
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
Hola, utiliza $items_origin[‘productos’], ya que te interesa acceder a los productos.
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
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
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
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
Hola Jhon, una consulta, este metodo seria para correrlo manualmente y local, no? Se puede automatizar en el servidor de WP directamente?
Muchas gracias!
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.
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,
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.
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?
Hola, difícil saberlo, ve depurando con el error_log, prueba igualmente en otro sitio de ejemplo y verifica si te sucede lo mismo.
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.
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.