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?
Buen dia.. pudiste resolver este tema?
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
Saludos Amigo.
¿Lograste resolver este invonveniente?
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.
buenos dias si serviria este codigo para actualizar mas de 1000 productos no me daría problemas
Hola, si usas batch esta limitado a 100 productos u objetos, tendrías que ejecutarlo en varias veces o programar algún cron.
$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
Hola, $param_sku tiene que tener los SKUs separados por comas, prueba con solo algunos productos y verifica.
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.
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.
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
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.
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”
}
…
Buen dia Carlos, parece que estamos trabajando con el mismo proveedor.
Si gustas podemos intercambiar codigos
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
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
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.
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
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.
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.
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.
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.
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?
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.
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
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
Can you do this for me?
For a fee, of course
You can contact me from this url: https://decodecms.com/contacto/
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?
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/
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!
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
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.
Buen día, lo solucione de esta forma:
Saludos.
Gracias por el aporte. Saludos.
Saludos amigo, gracias por el aporte funciona perfecto, excto que no actulaiza los productos variables, podrias ayudarme que esta fallando..? Gracias…
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
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!
Hola, si, tendrías posiblemente que hacer un plugin que lea los datos externos, puedes contactarme desde: https://decodecms.com/contacto/
Hola Jhon! Còmo puedo hacer para que el mètodo ->get(‘products’), me devuelva ciertos atributos del producto no todas las columnas
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.
Sabes como puedo poner el cronjob desde cpanel? Veo que no tiene composer instalado
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.
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
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
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
Hola, evaluaré profundizar en ese tema de sincronización de stock y precios en un curso.
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.
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
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.
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.