fbpx
León Desarrollo - Programación WordPress

Sincronización de stock con WooCommerce


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.

  1. 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.
  2. 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.

Suscríbete

Si quieres estar al día con las novedades de este sitio te recomiendo que te suscribas.

Comentarios

Deja un comentario


Puede que también te interese

2018 animaciones animación Aranda array atributos añade base de datos buscar categoría css curso diseño Duero emprendimiento fechas fiduero guía imagen imagenes inauguracion instalar Isilla javascript linux local mac node.js pagina pagina web php post problemas producto servicio servidor solución split sql sql server stock string windows woocommerce wordpress

febrero 2024
L M X J V S D
 1234
567891011
12131415161718
19202122232425
26272829