Saltar al contenido principal

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.md y resuelto en wordpress-plugin/neuroon-search/includes/admin-page-wrapper.php.

Estructura de pestañas

TabVisiblePara qué sirve
SettingsSiempreAPI Key, Shop ID, Verify / Unverify, Developer Tools (override URL si WP_DEBUG).
ProductsTras verificarDataTables 1.13.6 server-side con estado por producto, sync manual, Reset & Resync All.
WidgetTras verificarGeneración / pegado del Widget Token, color, locale, container.
DiagnosticsTras verificarEstado 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 expande error_message).
  • NOT_SYNCED — naranja (excluido por reglas locales: borrador, sin precio, etc.).

AJAX endpoints

El admin expone los siguientes hooks wp_ajax_*:

ActionMétodoPara qué
neuroon_start_syncPOSTInicia la cola: marca seleccionados como PENDING y arranca el bucle.
neuroon_sync_batchPOSTProcesa un batch (100 productos) y devuelve resultado parcial.
neuroon_sync_statusGETPolling: devuelve contadores por estado.
neuroon_resync_allPOSTMarca todos los productos como PENDING (FULL sync).
neuroon_clear_failedPOSTLimpia 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.md y handlers en wordpress-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)

KeyTTLPara qué
neuroon_shop_info_{md5(api_key)}5 minQuotas (maxProducts, productsCount, etc.).
neuroon_rate_limit_{endpoint}dinámicoBloqueo activo en 429.
neuroon_admin_notice45 sMensajes 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 = FAILED y su error_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 endpoint y retry_after).

Próximos pasos