WordPress · Sincronización de productos
El plugin sincroniza tu catálogo WooCommerce con Neuroon mediante el endpoint:
/api/plugin/shops/{shopId}/products/syncLa sync es idempotente por externalId (típicamente el ID del producto en WP). Reenviar el mismo producto actualiza, no duplica.
Modos de sincronización
| Modo | Cuándo usarlo | Comportamiento |
|---|---|---|
FULL | Primera carga o re-bootstrap | Marca como ausentes los productos que no estén en el batch acumulado. |
INCREMENTAL | Día a día (autosync, deltas) | Solo crea / actualiza los productos enviados; el resto queda intacto. |
El plugin usa INCREMENTAL por defecto. Solo dispara FULL cuando lanzas Reset & Resync All desde la pestaña Products.
Tamaño de batch
| Capa | Límite |
|---|---|
| Plugin (cliente) | 50 productos por defecto (Neuroon_Constants::DEFAULT_BATCH_SIZE = 50), configurable entre MIN_BATCH_SIZE = 10 y MAX_BATCH_SIZE = 500 mediante la opción neuroon_batch_size |
| Backend (servidor) | hasta 500 productos por petición |
Cita: constantes en
wordpress-plugin/neuroon-search/includes/class-neuroon-constants.php(líneas 42–48).
El plugin envía en lotes pequeños a propósito: limita el footprint de memoria PHP, evita timeouts típicos de PHP-FPM (max_execution_time) y absorbe mejor los rate limits. Si tu hosting aguanta más, sube la opción neuroon_batch_size desde la pestaña Products → Settings.
Auto-sync vía hooks WooCommerce
El plugin engancha los siguientes eventos de WooCommerce y mueve el producto correspondiente a estado PENDING en su tabla local wp_neuroon_product_sync:
add_action('woocommerce_update_product', array(__CLASS__, 'on_product_updated'));
add_action('woocommerce_new_product', array(__CLASS__, 'on_product_created'));
add_action('woocommerce_product_set_stock', array(__CLASS__, 'on_stock_changed'));
add_action('before_delete_post', array(__CLASS__, 'on_product_deleted'));
Cita: hooks listados en
wordpress-plugin/CLAUDE.mdy registrados enwordpress-plugin/neuroon-search/includes/product-sync-hooks.php.
Comportamiento:
- Producto editado → si estaba
SYNCED, vuelve aPENDING. - Producto creado → queda
PENDING(selección manual o autosync, según ajustes). - Cambio de stock (
woocommerce_product_set_stock) → re-sync. - Producto eliminado (
before_delete_post) → se borra de la tabla local; un job posterior emitiráDELETE /api/plugin/shops/{shopId}/products/{externalId}.
Tabla local de tracking
Custom table: {prefix}_neuroon_product_sync.
CREATE TABLE wp_neuroon_product_sync (
product_id BIGINT(20) UNSIGNED NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
last_synced_at DATETIME NULL,
last_modified_at DATETIME NOT NULL,
error_message TEXT NULL,
sync_attempts INT NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (product_id),
KEY status (status),
KEY last_modified_at (last_modified_at)
);
Cita: esquema en
wordpress-plugin/CLAUDE.md(sección Database Schema).
Estados:
| Status | Significado |
|---|---|
PENDING | En cola, aún no enviado. |
PROCESSING | Enviado, esperando respuesta. |
SYNCED | Aceptado por el backend (200/201). |
FAILED | Backend devolvió error; ver error_message. |
NOT_SYNCED | Producto excluido por reglas locales (ej. borrador). |
Respuesta del endpoint
Cada llamada /products/sync devuelve un JSON con el agregado de ese batch:
{
"totalReceived": 100,
"newProducts": 50,
"updatedProducts": 47,
"skipped": 0,
"failed": 3,
"errors": [
{ "externalId": "123", "error": "Invalid price" }
],
"productsCount": 150,
"remainingProducts": 850
}
productsCount y remainingProducts reflejan tu cuota global tras el batch. El plugin muestra esos valores en la pestaña Products y bloquea nuevos batches si remainingProducts == 0.
Latencia (eventual consistency)
Tras el 200 OK, los productos pasan por el pipeline interno . La indexación tarda 2 a 5 segundos. Hasta que termina, una búsqueda inmediata puede no devolverlos.
Rate limits
| Endpoint | Límite |
|---|---|
products/sync | 100/min |
shops/me | 60/min |
verification-data | 20/min |
Cita: matriz de rate limits resumida en el brief y aplicada por
Neuroon_Rate_Limit_Handler.
El plugin captura 429 y respeta el Retry-After. Si tu tienda tiene > 6.000 productos y necesitas un bootstrap rápido, contacta a soporte para ampliar la ventana.
Cuotas
El plan asociado a tu API Key define maxProducts. La pestaña Products lee productsCount / maxProducts desde GET /api/plugin/shops/me (cache 5 min en transient neuroon_shop_info_{md5(api_key)}).
Sync manual desde la UI
- wp-admin → Settings → Neuroon Search → Products tab.
- Selecciona productos (DataTables 1.13.6 server-side).
- Pulsa Sync selected. La UI dispara
wp_ajax_neuroon_start_syncy luego polleawp_ajax_neuroon_sync_status. - Cada batch (100) se envía secuencialmente con
usleep(100000)(100 ms) entre lotes para no saturar.
Resync forzada
Products tab → Reset & Resync All marca todos los productos como PENDING y dispara una sync FULL. Útil si:
- Sospechas que la tabla local está desincronizada respecto a Neuroon.
- Has cambiado masivamente atributos / categorías.
- Acabas de migrar de plan y necesitas re-validar la cuota.
Próximos pasos
- Cart bridge — tras sincronizar, el widget se beneficia del estado del carrito.
- API ·
products/sync— referencia completa con playground. - Recipe · WooCommerce end-to-end.