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

5 respuestas a «Sincronización de stock con WooCommerce»

  1. Avatar de Pablo
    Pablo

    Hola,

    Muchas gracias por ofrecernos este contenido de calidad, es muy difícil encontrar contenido así en nuestro idioma.

    Aprovechando este código, me gustaría poder actualizar más parámetros (como el precio y demás), imagino que será cuestión de añadir los nuevos parámetros y ya. Tengo preparada la vista SQL con toda la información que quiero actualizar, pero estoy bastante perdido y no sé donde ubicar el código.

    ¿Este código se aloja en archivos de WordPress? ¿En nuestro ordenador? Por ejemplo, comentas que la primera aplicación hay que ponerla en el archivo main.js, pero no encuentro ese archivo en WordPress. El segundo, dices de ubicarlo dentro del archivo del tema que maneja los endpoints, pero tampoco lo encuentro.

    ¿Podrías hacer una pequeña guía para ultra-novatos como yo?

    Muchísimas gracias,
    Un saludo!

    1. Avatar de León Desarrollo

      ¡Buenas!

      Me alegro mucho que te guste el contenido. Cuando comencé con el desarrollo WordPress me costó mucho encontrar documentación en castellano, por lo que decidí compartir fragmentos de lo que realizo en mi día a día.

      No te he contestado antes, por que he estado elaborando la guía que me has solicitado:
      Cómo insertar código en WordPress

      Espero que te pueda servir, y si necesitas alguna ayuda más, no dudes en contactarme.

      ¡Un saludo, gracias Pablo!

      1. Avatar de Pablo
        Pablo

        Guau, muchísimas gracias por la rápida respuesta y la pedazo de solución de tener otro manual más. Me pongo ya en marcha!

        Mil gracias!!

      2. Avatar de Pablo
        Pablo

        Vale, ya imaginaba que no sería tan sencillo.

        He creado una carpeta en plugins con el nombre del plugin y dentro he creado un archivo PHP con el contenido del primer script (y añadiendo la cabecera del nuevo manual que has realizado). Si lo activo desde WordPress, me da el error «El plugin no ha podido activarse porque ha provocado un error fatal.».

        Esto imagino que será porque no he sido capaz de crear el endpoint personalizado. Dices que hay que colocarlo en el archivo del plugin, dentro de tu función que maneja los endpoints, pero con esto sí que estoy perdido.

        He añadido el segundo código dentro del functions.php del tema (en mi caso, hello-elementor, aunque no creo que afecte) pero no hay manera de acceder al endpoint desde la URL. Me sale el error:
        «{
        «code»: «rest_no_route»,
        «message»: «No se ha encontrado ninguna ruta que coincida con la URL y el método de la solicitud.»,
        «data»: {
        «status»: 404
        }

        ¿Cómo puedo añadir este endpoint a mi WordPress?

        Como puedes ver, aún con el nuevo manual soy bastante negado para esto, disculpa mi torpeza.

        Muchas gracias,
        Un saludo!

        1. Avatar de León Desarrollo

          Buenas de nuevo Pablo. Me alegro que te pueda servir, jeje.

          Creo que el error que estás experimentando se debe a que has creado un nuevo END POINT en la API, ¿me confundo?
          Si es así la solución es bastante más sencilla. Simplemente tienes que volver a generar los enlaces permanentes para que tu sitio lo reconozca (Ajustes/Enlaces Permanentes).
          Únicamente tienes que pulsar sobre «Guardar» sin modificar nada.

          Si es otro caso, puedes enviarme tu fragmento de código por email para que lo revise (roberto@leondesarrollo.es).
          No hace falta que me envíes todo el contenido, únicamente las cabeceras para comprobar que llamada sea correcta.

          De todos modos, te recomiendo que instales el plugin Query Monitor. Al activar el plugin (el tuyo) aparecerá en la parte superior (en rojo) el error generado.

          Espero que pueda ayudarte.

          ¡Un saludo!

Deja un comentario


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