WordPress · Admin dashboard
El plugin añade un único menú en Settings → Neuroon Search con varias pestañas. La pestaña activa por defecto depende del estado de verificación: si no estás verificado, solo se muestra Settings; al verificar, se habilitan Products, Widget y Diagnostics (progressive disclosure).
Cita: patrón "default tab based on verification status" descrito en
wordpress-plugin/CLAUDE.mdy resuelto enwordpress-plugin/neuroon-search/includes/admin-page-wrapper.php.
Estructura de pestañas
| Tab | Visible | Para qué sirve |
|---|---|---|
| Settings | Siempre | API Key, Shop ID, Verify / Unverify, Developer Tools (override URL si WP_DEBUG). |
| Products | Tras verificar | DataTables 1.13.6 server-side con estado por producto, sync manual, Reset & Resync All. |
| Widget | Tras verificar | Generación / pegado del Widget Token, color, locale, container. |
| Diagnostics | Tras verificar | Estado del bridge, ping al API, contadores de rate limit, últimos errores. |
Capabilities
Todas las acciones de admin están protegidas por:
if (!current_user_can('manage_options')) {
wp_die(__('Insufficient permissions'));
}
Es decir, solo administradores (capability manage_options) pueden tocar el plugin. Los nonces (wp_nonce_field / check_admin_referer / check_ajax_referer) bloquean CSRF en cada formulario.
Cita: requisitos de seguridad (capabilities + nonces) listados en
wordpress-plugin/CLAUDE.md(sección Security Requirements).
DataTables (Products tab)
La tabla de productos usa DataTables 1.13.6 server-side servido localmente desde assets/vendor/ (sin CDN), con paginación, búsqueda y ordenación delegadas a WP. Esto evita la latencia extra del CDN y el riesgo de bloqueo en entornos restringidos.
Filas por estado (color codificado):
PENDING— gris.PROCESSING— azul (animación spinner).SYNCED— verde.FAILED— rojo (con tooltip que expandeerror_message).NOT_SYNCED— naranja (excluido por reglas locales: borrador, sin precio, etc.).
AJAX endpoints
El admin expone los siguientes hooks wp_ajax_*:
| Action | Método | Para qué |
|---|---|---|
neuroon_start_sync | POST | Inicia la cola: marca seleccionados como PENDING y arranca el bucle. |
neuroon_sync_batch | POST | Procesa un batch (100 productos) y devuelve resultado parcial. |
neuroon_sync_status | GET | Polling: devuelve contadores por estado. |
neuroon_resync_all | POST | Marca todos los productos como PENDING (FULL sync). |
neuroon_clear_failed | POST | Limpia filas en FAILED para que la siguiente vuelta las reintente. |
Cada handler hace:
check_ajax_referer('neuroon_sync_nonce', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Insufficient permissions');
}
Cita: patrón AJAX seguro en
wordpress-plugin/CLAUDE.mdy handlers enwordpress-plugin/neuroon-search/includes/product-sync-ajax.php.
Rate limit display
El admin muestra el estado de rate limit por endpoint usando los transients:
neuroon_rate_limit_sync(window por minuto, 100/min).neuroon_rate_limit_shop-info(60/min).neuroon_rate_limit_verification(20/min).
Cuando el plugin recibe un 429, parsea Retry-After y bloquea nuevas llamadas hasta que expire el transient. La UI imprime un cronómetro descendente.
Mensajes de admin (transients)
Los mensajes entre POST handlers y la vista se transmiten vía:
set_transient('neuroon_admin_notice', array(
'type' => 'success',
'message' => __('Domain verified', 'neuroon-search')
), 45);
Cita:
wordpress-plugin/CLAUDE.md(sección Error Handling Pattern).
Esto evita el patrón "post-redirect-get" con query params expuestos en la URL.
Cache local (transients)
| Key | TTL | Para qué |
|---|---|---|
neuroon_shop_info_{md5(api_key)} | 5 min | Quotas (maxProducts, productsCount, etc.). |
neuroon_rate_limit_{endpoint} | dinámico | Bloqueo activo en 429. |
neuroon_admin_notice | 45 s | Mensajes one-shot. |
Diagnostics tab
Imprime:
- Versión del plugin (
NEUROON_VERSION). - Versión del widget cargado (
NEUROON_WIDGET_VERSION+ SRI hash). - Resultado del último
GET /api/plugin/shops/me. - Estado del cart bridge (jQuery detectado / no detectado).
- Últimas 10 entradas con
status = FAILEDy suerror_message. - Botón Run health-check que dispara una llamada en vivo y la muestra en bruto.
Logs
Con WP_DEBUG_LOG = true, los errores del plugin se escriben en wp-content/debug.log. El plugin loguea:
- Errores HTTP de las llamadas al API (status + body truncado a 1 KB).
- Excepciones de hooks WC.
- Eventos de bloqueo por rate limit (con
endpointyretry_after).
Próximos pasos
- Sync de productos — detalle del bucle batch.
- Cart bridge — cómo se conecta con el widget.
- Authentication · Rate Limits — política completa.