Fix Admin Panel: Resolver error de nonce y validación de URLs

Dos fixes críticos para el admin panel del tema:

1. **Fix error de nonce en AJAX**
   - Cambiar de wp_verify_nonce() a check_ajax_referer()
   - check_ajax_referer() es el método recomendado por WordPress para AJAX
   - Aplicado en ajax_get_settings() y ajax_save_settings()
   - El nonce ahora se valida correctamente

2. **Fix validación de URLs relativas**
   - Aceptar URLs relativas que empiezan con / (ej: /catalogo)
   - filter_var() con FILTER_VALIDATE_URL rechazaba URLs relativas
   - Agregada validación adicional con regex para paths relativos
   - Mantiene validación para URLs completas

Archivos modificados:
- admin-panel/includes/class-settings-manager.php
- admin-panel/includes/class-validator.php

Issue: #144

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
FrankZamora
2025-11-10 10:58:50 -06:00
parent 3beb292901
commit fb36424112
2 changed files with 13 additions and 11 deletions

View File

@@ -144,10 +144,8 @@ class APUS_Settings_Manager {
* AJAX: Obtener configuraciones
*/
public function ajax_get_settings() {
// Verificar nonce
if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'apus_admin_nonce')) {
wp_send_json_error('Nonce inválido');
}
// Verificar nonce usando check_ajax_referer (método recomendado para AJAX)
check_ajax_referer('apus_admin_nonce', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Permisos insuficientes');
@@ -161,10 +159,8 @@ class APUS_Settings_Manager {
* AJAX: Guardar configuraciones
*/
public function ajax_save_settings() {
// Verificar nonce
if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'apus_admin_nonce')) {
wp_send_json_error('Nonce inválido');
}
// Verificar nonce usando check_ajax_referer (método recomendado para AJAX)
check_ajax_referer('apus_admin_nonce', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Permisos insuficientes');

View File

@@ -66,9 +66,15 @@ class APUS_Validator {
$errors[] = 'El texto del enlace no puede exceder 50 caracteres';
}
// Validar link_url
if (!empty($top_bar['link_url']) && !filter_var($top_bar['link_url'], FILTER_VALIDATE_URL)) {
$errors[] = 'La URL del enlace no es válida';
// Validar link_url (acepta URLs completas y relativas que empiecen con /)
if (!empty($top_bar['link_url'])) {
$url = $top_bar['link_url'];
$is_valid_url = filter_var($url, FILTER_VALIDATE_URL) !== false;
$is_relative_url = preg_match('/^\//', $url);
if (!$is_valid_url && !$is_relative_url) {
$errors[] = 'La URL del enlace no es válida';
}
}
// Validar link_target