Este artículo es la respuesta a una consulta que me ha realizado un visitante, el cual cuenta con una tienda física y necesita realizar una sincronización de stock con WooCommerce, permitiéndole reducir el stock por cada venta que se realice en su tienda física y evitar ventas sin stock.
Aunque parezca complicado, si se analiza correctamente el flujo de la información y los desencadenantes, podemos crear un desarrollo que se encargue de sincronizar casi a tiempo real el stock de la tienda física en WooCommerce
Requisitos previos
Para realizar este desarrollo, es necesario contar con un software de gestión (TPV, ERP, etc…) y acceso a su base de datos. El equipo debe tener conexión a internet. La mayoría de los software de gestión cuentan con APIs y guías de desarrollo para poder crear adaptaciones e integraciones. Si ese es tu caso utiliza la documentación de tu software, ya que está probada y ya se han depurado los errores.
En caso de que no cuentas con documentación de desarrollo, atacaremos directamente a su base e datos (sólo realizaremos consultas).
Planteamiento inicial
Vamos a plantear una comunicación unidireccional, la cual consiste en que el equipo que cuenta con el software de gestión se encargue de enviar constantemente peticiones a WooCommerce o a un servicio personalizado.
- TPV o equipo de gestión:
- Para evitar abrir puertos y conseguir una IP fija, vamos a crear un servicio que se ejecute en el equipo y envíe la información a WooCommerce.
- WooCommerce:
- En vez de utilizar la API de WooCommerce, vamos a crear un plugin personalizado con los endpoints que necesitemos.
Servicio de envío de información
Para crear este servicio vamos a utilizar Node.js, ya que es un lenguaje de programación perfecto para crear aplicaciones de servidor o de segundo plano.
Vamos a ponernos manos a la obra para crear esa aplicación Node.js con conexión a SQL Server y envío de datos a tu endpoint personalizado.
Primero, asegúrate de tener instaladas las dependencias necesarias:
npm install tedious axios node-cron
Ahora, vamos a crear una aplicación sencilla en el archivo main.js. El código para la aplicación es el siguiente:
const sql = require('tedious'); const axios = require('axios'); const cron = require('node-cron'); // Configuración de conexión a SQL Server const config = { server: 'tu_servidor_sql', authentication: { type: 'default', options: { userName: 'tu_usuario_sql', password: 'tu_contraseña_sql', }, }, options: { encrypt: true, database: 'tu_base_de_datos', }, }; // Endpoint personalizado en WooCommerce const woocommerceEndpoint = 'https://tu-sitio.com/wp-json/tu/v1/sincronizar'; // Función para realizar la consulta a SQL Server y enviar los datos async function sincronizarDatos() { const connection = new sql.Connection(config); connection.on('connect', async function (err) { if (err) { console.error('Error de conexión a SQL Server:', err.message); } else { // Realizar consulta a la base de datos const request = new sql.Request(connection); const query = 'SELECT sku, stock FROM tu_tabla'; request.query(query, async function (err, rows) { if (err) { console.error('Error al ejecutar la consulta:', err.message); } else { // Formatear los datos según la estructura deseada const productos = rows.recordset.map((producto) => ({ sku: producto.sku, stock: producto.stock, })); // Enviar datos al endpoint de WooCommerce try { await axios.post(woocommerceEndpoint, { productos }); console.log('Datos enviados correctamente a WooCommerce.'); } catch (error) { console.error('Error al enviar datos a WooCommerce:', error.message); } } // Cerrar la conexión después de cada ejecución connection.close(); }); } }); } // Programar la tarea cada 5 minutos cron.schedule('*/5 * * * *', sincronizarDatos);
Este código realiza una consulta a SQL Server cada 5 minutos y envía los datos al endpoint de WooCommerce. Asegúrate de llenar los valores de configuración con la información correcta de tu entorno.
Esta es la base para comenzar, aunque es interesante que esta aplicación la estudies y la optimices según tus necesidades. Cada caso es distinto, por lo que aquí solo te enseño a desarrollar la aplicación mínima viable.
Si utilizar esta aplicación como servicio de Windows puedes acceder a este enlace para aprender como.
Endpoint personalizado de WordPress
Vamos a crear el endpoint en WordPress para recibir la información y actualizar el stock de los productos en WooCommerce. Puedes agregar el siguiente código en tu plugin personalizado:
// En tu archivo del plugin, dentro de tu función que maneja los endpoints add_action('rest_api_init', function () { register_rest_route('tu/v1', '/sincronizar', array( 'methods' => 'POST', 'callback' => 'tu_funcion_de_sincronizacion', 'permission_callback' => '__return_true', // Esto permite la llamada sin autenticación, puedes ajustarlo según tus necesidades. )); }); // Función para manejar la sincronización y actualización de stock function tu_funcion_de_sincronizacion($request) { // Obtener los datos enviados en la solicitud $data = $request->get_json_params(); // Verificar si hay datos y si contiene la estructura esperada if (isset($data['productos']) && is_array($data['productos'])) { foreach ($data['productos'] as $producto) { // Obtener SKU y Stock del producto $sku = sanitize_text_field($producto['sku']); $stock = intval($producto['stock']); // Actualizar el stock del producto en WooCommerce if ($sku && $stock >= 0) { // Obtener el ID del producto por el SKU $product_id = wc_get_product_id_by_sku($sku); // Actualizar el stock del producto if ($product_id) { update_post_meta($product_id, '_stock', $stock); update_post_meta($product_id, '_stock_status', ($stock > 0 ? 'instock' : 'outofstock')); // Puedes agregar más lógica aquí, como registrar cambios en un log, etc. } } } // Devolver una respuesta exitosa return new WP_REST_Response('Stock actualizado correctamente', 200); } else { // Devolver una respuesta de error si la estructura no es la esperada return new WP_REST_Response('Error en el formato de datos', 400); } }
Este código registra un endpoint personalizado (tu/v1/sincronizar
) que espera recibir un JSON con la estructura que especificaste. Luego, itera sobre los productos recibidos y actualiza los metadatos de cada uno.
Recuerda ajustar el nivel de permisos (permission_callback
) según tus necesidades de autenticación y seguridad.
Deja un comentario