A la hora de montar una tienda online, una de las tareas más importantes a tener en cuenta antes de empezar a rodar es tener control total del stock de nuestro ecommerce para poder gestionarlo cómodamente desde nuestra web.
Woocommerce es la herramienta que WordPress nos ofrece para montar una tienda online fácil de gestionar y cómoda para nuestros clientes, pero para poder utilizarla debemos importar los datos de nuestro inventario desde un excel u otros sistemas de almacenamiento de datos.
A veces, por las características de nuestro negocio, subir productos es una tarea relativamente sencilla porque disponemos de un stock reducido y se puede importar cómodamente a nuestra tienda online gracias al importador predefinido de Woocommerce o, incluso, podemos subir los productos de uno en uno. Sin embargo, ¿qué sucede cuando tenemos un stock de cientos de productos o los datos de nuestro inventario se encuentran almacenados en un ERP externo o en una base de datos externa a nuestro WordPress?
Lo que en un principio se nos antojaba una tarea sencilla, se nos puede poner un poco cuesta arriba. Afortunadamente, WordPress cuenta con una API que nos va a facilitar la gestión de nuestra tienda a unos niveles asombrosos, ofreciéndonos además la oportunidad de compartir datos con programas externos de gestión de inventario para poder importar productos masivamente. Dicho esto, vamos a enseñaros la magia de la API de Woocommerce.
Tabla de Contenidos
Librerías para API de Woocommerce e instalación
Se puede trabajar con la API de Woocommerce gracias a las librerías que nos ofrecen sus desarrolladores o equipos de terceros. Hay librerías para los lenguajes de programación más utilizados, como JavaScript, Python, Java, etc. En nuestro caso, vamos a trabajar con la librería de PHP, que se llama automattic/woocommerce.
Nosotros ya hemos trabajado con esta librería y la API de Woocommerce, desarrollando nuestra propia APP para un cliente que necesitaba gestionar el inventario de Woocommerce con los datos que manejaba su ERP. Aquí, mostraremos un ejemplo más sencillo trabajando sobre un script de php que ejecutaremos desde la terminal.
Para empezar, necesitaremos instalar la librería para nuestro script a través de Composer, el sistema de gestión de paquetes de PHP. Si no tenéis instalado Composer, podéis hacerlo a través de este enlace.
Pues bien, para instalar la librería, solo tenéis que abrir la terminal de Windows o la de Git en el directorio de vuestro script y ejecutar la siguiente instrucción.
“composer require automattic/woocommerce”
Para facilitar la tarea, podéis abrir la terminal desde el editor de código donde editéis el script. Nosotros utilizamos Visual Studio Code y para abrir la terminal solo hay que pulsar Ctrl+J y se os abrirá la terminal que tengáis configurada, como en la imagen.
Una vez ejecutada la instrucción, la librería se instalará dentro del directorio vendor y podréis emplearla en vuestro script, escribiendo las siguientes dos líneas de código:
require __DIR__ . ‘/vendor/autoload.php’;
use Automattic\WooCommerce\Client;
Con esto, ya podréis crear una conexión con vuestra tienda Woocommerce, instanciando una clase Client de la siguiente manera:
$woocommerce = new Client(
URLTIENDA, //Dirección web de la tienda
KEYCLIENT, //Clave del cliente
SECRETKEY, // Clave secreta del cliente
[
‘version’ => ‘wc/v3’,
‘timeout’ => 300,
]
);
Como veréis, para conectar nuestra tienda de Woocommerce con nuestro script necesitaremos tres cosas:
- La dirección de la tienda. Obviamente, el script debe saber hacia dónde debe mandar la información.
- La clave del cliente
- La clave secreta del cliente
Estas claves son las medidas de autentificación que nos ofrece la API para evitar que cualquiera pueda leer los datos de nuestra tienda o meter datos maliciosos a través de la API. Para obtener esas claves, solamente tendremos que ir a nuestro panel de ajustes de Woocommerce, ir a la pestaña de Avanzado y seleccionar los ajustes de API REST. Pasamos captura para que veáis donde se encuentra.
Como veis, nosotros ya tenemos creada una clave con los permisos de escritura y lectura para poder consultar los datos de nuestra tienda online y también subir nueva información desde nuestro script. Para crear una clave nueva, solo tenéis que darle a añadir clave, poner una descripción para identificar el uso de esa clave por si luego queremos cambiarle permisos o borrarla, asignarle un usuario y seleccionar si queremos que sea una clave de lectura, escritura o que nos ofrezca ambas opciones.
Tras realizar esos ajustes y pulsar el botón para generar la clave, guardad muy bien las dos claves, pues WooCommerce no os la volverá a enseñar por motivos de seguridad. Después, ponedlas en los parámetros correspondientes de la clase Client que hemos usado antes, poniendo la url de la web con la que queréis conectaros. Os tendría que quedar algo así:
$woocommerce = new Client(
«https://mitiendaonline.es», //Dirección de vuestra tienda online
«dfeqwd3qdasfsadascadfa», //Vuestra Clave del cliente
«fsfes4v24rfewzvgewfascsd», // Vuestra Clave secreta del cliente
[
‘version’ => ‘wc/v3’,
‘timeout’ => 300,
]
);
Si os habéis fijado, en el ejemplo anterior, que es nuestro ejemplo real, hemos usado constantes para la url de la tienda y las dos claves de la API. Como consejo, sobre todo si es posible que el código pueda ser visto por más personas, nunca pongáis claves secretas en texto limpio. Lo más seguro es usar variables de entorno guardadas en un archivo .env, aunque también podéis usar constantes si estáis trabajando en local y queréis mostrar una captura del código, tal y como estamos haciendo nosotros ahora.
Por otro lado, veréis que hay un cuarto parámetro en forma de array asociativo. Ese parámetro, llamado options, sirve para dar información extra sobre el tipo de conexión que queremos. En nuestro caso, estamos diciendo a la API que vamos a usar la versión 3 de la misma y el tiempo de espera en la respuesta antes de dar error de conexión. Podéis consultar todos los valores que se pueden dar al parámetro options en la documentación de la API.
Estructura de los datos de la API de Woocommerce
Bien, con esto ya estamos listos para empezar a mandar y recibir información a través de la API de Woocommerce, aunque antes debemos entender cómo funciona. Como cualquier otra API, podemos enviar y recibir información a través de distintos endpoints con los métodos GET, POST, DELETE, PUT, etc.
Podemos recibir información tanto de los productos que tenemos subidos en la tienda, como de los clientes, pedidos y hasta de los cupones de descuento que tenemos activos en la tienda. Cualquier dato de nuestro ecommerce, podemos consultarlo a través de la API.
Como en este caso vamos a manejar información de los productos para realizar la importación, os voy a mostrar el ejemplo que viene en la documentación de la API para subir un producto simple:
$data = [
‘name’ => ‘Premium Quality’,
‘type’ => ‘simple’,
‘regular_price’ => ‘21.99’,
‘description’ => ‘Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.’,
‘short_description’ => ‘Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.’,
‘categories’ => [
[
‘id’ => 9
],
[
‘id’ => 14
]
],
‘images’ => [
[
‘src’ => ‘http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_front.jpg’
],
[
‘src’ => ‘http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_back.jpg’
]
]
];
print_r($woocommerce->post(‘products’, $data));
Como véis, los primeros datos son fáciles de entender. Debemos indicarle a la API el nombre de nuestro producto, el tipo (si es simple o variable), el precio, las descripciones, etc… Los campos con los que debemos tener cuidado a la hora de exportar productos simples son las categorías y las imágenes.
Para importar categorías, estas deben estar creadas antes en nuestro panel de administración de Woocommerce y deben identificarse con el id. Para saber el id de cada categoría, lo más sencillo es ir al menú Categorías del panel de Productos de Woocommerce, seleccionar la categoría de la que queremos saber el id y fijarnos en los parámetros de la url.
Como veréis gracias al resaltado, el id de la categoría aparece como parámetro, así que solo será cuestión de apuntar cuál es el id de cada categoría de nuestro inventario.
En cuanto a la imagen, se pueden subir a la API pasándole una ruta y esto creará una nueva imagen en nuestra biblioteca de medios de WordPress, así que si realizáis varias importaciones tened cuidado para no acabar con varias imágenes repetidas dentro de WordPress, aunque también podéis asociar la imagen de un producto a través del ID de la base de datos, aunque eso os llevará un poquito más de trabajo.
Ahora bien, cuando tengamos todos los datos del producto, solo habrá que guardarlos en una variable y mandarlos a la API de Woocommerce con la siguiente línea de código:
print_r($woocommerce->post(‘products’, $data));
Seguro que estaréis pensando: “Vale, tengo 300 productos. No me sale a cuenta guardar los datos de los 300 productos en una variable, ni seguir el ejemplo de la documentación de la API 300 veces. Además, tengo la información de mis productos en una base de datos o en un ERP, ¿debo ir copiándolos uno a uno en mi código?
Aquí es donde entra la magia de PHP y de las APIs. Hay varias formas de leer los datos de vuestros productos sin tener que ir copiando los datos de todos ellos uno a uno.
Métodos para leer los datos de nuestro inventario
A través de una API REST
Si vuestro ERP o programa de gestión de inventarios permite leer datos a través de endpoints, como por ejemplo: https://mierpdeinventario.com/productos, y podéis leer los datos en formato json, estáis de enhorabuena. Este es uno de los métodos más cómodos para leer los datos de productos y solo tendríamos que leer los datos a través de una una llamada curl como esta:
print_r($woocommerce->post(‘products’, $data));
Cada ERP o API tendrá sus métodos de autentificación para impedir que cualquiera entre a consultar información. Para agilizar, yo he usado un método de autentificación a través de cookies, aunque lo idóneo es hacerlo a través de un token de autentificación. Lo importante es que os fijéis en que debéis obtener una respuesta y guardarla en una variable, que emplearemos después para importar los productos.
A través de una base de datos externa:
A veces, no contamos con la oportunidad de consumir una API porque nuestro ERP no lo permite o por otros motivos. Sin embargo, sí tenemos los datos de nuestro inventario guardado en una base de datos, con lo que solo tendríamos que tener los datos de acceso a la base de datos (Servidor, Usuario, Nombre de la base de datos y Contraseña) para poder acceder a la información. Este es un ejemplo de lectura de base de datos a través de una conexión mysqli:
$connection = mysqli_connect(DBHOST, DBUSER, DBPASSWORD, DBNAME);
mysqli_query($connection, «SET NAMES ‘utf8′»);
$sql = «SELECT `name`, `prize`, `description`, `categories`, `images` FROM `productos`»;
$query = mysqli_query($connection, $sql);
$data = [];
while($producto = mysqli_fetch_assoc($query)) {
array_push($data, $producto);
}
return $data;
Hay más métodos para conectarse a una base de datos. Yo estoy usando las funciones que te da PHP para hacer una conexión a través de mysqli. Lo importante es que os déis cuenta de que por este método también necesitamos una variable data que guarde toda la información de nuestro inventario. En este código, he realizado la conexión a través de nuestras credenciales, luego he configurado que podamos leer los datos a través de caracteres utf-8, he realizado la consulta y para obtener todos los datos de esa consulta, he realizado un buque while para guardar cada resultado en nuestra variable data, que emplearemos más adelante, aunque antes de eso, vamos a ver la última forma que tenemos de leer los datos de nuestro inventario.
A través de un archivo externo
Esta no es la solución más idónea porque dependeremos siempre de tener actualizado el archivo de inventario y tenerlo a buen recaudo, mientras que una API y una base de datos actualizan los datos de forma más automática sin que nosotros tengamos que hacer nada, a no ser que seamos los encargados de gestionar esa información.
Si leemos los datos a través de un archivo externo, este siempre tiene que estar en el mismo directorio de nuestro script o en una ruta accesible y los datos deben poder leerse en formato json. Si tenemos un excel, tampoco pasa nada porque hay muchísimas herramientas virtuales de conversión para pasar un archivo de excel a uno json en un segundo.
Cuando tengamos a mano nuestro archivo, el código para tener la variable data con toda la información de nuestro inventario es el siguiente:
$file = file_get_contents(‘inventario.json’);
$data = json_decode($file);
return $data;
Como veis, el código es muy sencillo. Hay que usar función para obtener el contenido del archivo. Hay que pasarle como parámetro la ruta del archivo, así que si el archivo está en el mismo directorio que nuestro script, con ponerle el nombre del archivo será suficiente. Luego habrá que decodificar el json para convertirlo en un array que pueda leer nuestro script.
En estos tres ejemplos que hemos puesto, el código iría dentro de una función que nos devolvería la variable data que necesitamos para importar nuestros productos.
Ya estamos cerca del paso final. Con pocas líneas de código hemos obtenido información de cientos de productos. Ahora solo queda subirlo a nuestra web.
Importación masiva de productos
Si tenemos la variable data con toda la información de nuestro inventario, ya hemos pasado la peor parte. La dificultad del paso anterior proviene de la organización de nuestros datos y, si la estructura de la información es bastante compleja, es posible que tengamos que hacer nuevas funciones para, por ejemplo, generarle el id correspondiente a la categoría de nuestros productos. Sin embargo, una vez obtenida la variable data, todo es coser y cantar.
A través de un bucle foreach, que leerá cada elemento de nuestro conjunto de datos de forma individual, podemos organizar los datos para que los pueda leer la API de Woocoommerce. Aquí está el ejemplo:
foreach($data as $producto) {
try {
$datos_api = [
‘name’ => $producto->name,
‘type’ => $producto->type,
‘sku’ => $producto->sku,
‘regular_price’ => $precio,
‘description’ => $producto->description,
‘categories’ => [
[
‘id’ => $producto->id_categoria
],
],
‘images’ => [
[
‘src’ => $producto->src_imagen
],
]
];
print_r($woocommerce->post(‘products’, $datos_api));
}
catch (Exception $error) {
echo «Error importando productos: » . $error->getMessage();
}
}
Como veis, en cada bucle solo debemos coger la información dentro de la variable data que nos interesa, para pasársela a su lugar correspondiente dentro de la información que va a leer la API.
Un dato a tener en cuenta en este ejemplo, es que hemos usado una instrucción try – catch para evitar que la importación se detenga si hay algún error en algún producto y pase a importar el producto siguiente.
Una vez ejecutado este código en la terminal de Visual Studio Code con la instrucción: php nombre_script.php, solo nos queda sentarnos a esperar a que la importación finalice.
Visto esto, cada inventario es un mundo, por lo que os tocará pensar cómo adaptar la importación para que vuestro script pase la información a la API de Woocommerce.
En la documentación de la API, hay ejemplos sobre cómo subir cada tipo de producto. Por ejemplo, para subir un producto variable a los campos normales de producto, debéis añadirle un campo para indicarle cuántos atributos tiene y si se usan para variaciones y si son visibles, como en este ejemplo:
‘attributes’ => [
[
‘id’ => $id_atributo,
‘variation’ => true,
‘visible’ => true,
‘options’ => [ ‘opcion 1’, ‘opcion 2’, ‘opcion 3’ ],
],
Recordad que, al igual que en las categorías, los atributos deben estar creados antes y podéis consultar su id en el parámetro de su url.
Como consejo de despedida, si vais a realizar una importación muy compleja y vais a tener que usar muchas funciones para tener vuestra variable data lo más limpia posible, no hagáis un script kilométrico. Dividid los scripts en cachos más pequeños donde esté clara la funcionalidad de cada parte del código para que así sea más fácil trabajar.
El objetivo de la API de Woocommerce es dar una herramienta de importación de productos para sistemas de gestión de inventario muy complejos o que no puedan pasar los datos a través de un archivo de Excel al importador estándar de Woocommerce. Por eso, es muy fácil que si la estructura de vuestros datos no se asemeja a la API de Woocommerce, acabéis teniendo una aplicación con una estructura que tendréis que cuidar con el mayor mimo del mundo para que no os acabe comiendo a vosotros.