$hooks, 'critical_hooks' => $critical_hooks ]); } /** * Sanitize form data */ private static function sanitize_form_data($post_data) { $hook_priorities = []; if (isset($post_data['hook_priorities']) && is_array($post_data['hook_priorities'])) { foreach ($post_data['hook_priorities'] as $hook => $priority) { $hook_priorities[sanitize_text_field($hook)] = (int)$priority; } } return [ 'snippet_name' => sanitize_file_name($post_data['snippet_name'] ?? ''), 'php_code' => stripslashes($post_data['php_code'] ?? ''), 'js_code' => stripslashes($post_data['js_code'] ?? ''), 'css_code' => stripslashes($post_data['css_code'] ?? ''), 'description' => stripslashes($post_data['description'] ?? ''), 'template' => sanitize_text_field($post_data['template'] ?? ''), 'hook_priorities' => $hook_priorities ]; } /** * Validate form data */ private static function validate_form_data($form_data, $edit_mode) { // Check required fields if (empty($form_data['snippet_name'])) { return 'El nombre del snippet es requerido'; } // Validar formato del nombre para prevenir XSS if (!preg_match('/^[a-zA-Z0-9_-]+$/', $form_data['snippet_name'])) { return 'El nombre del snippet solo puede contener letras, números, guiones y guiones bajos'; } // Check for duplicate names (creation mode only) if (!$edit_mode && Simply_Snippet_Manager::get_snippet($form_data['snippet_name'])) { return 'Ya existe un snippet con ese nombre'; } // Validate PHP syntax (si existe la clase) if (!empty($form_data['php_code']) && class_exists('Simply_Syntax_Checker') && method_exists('Simply_Syntax_Checker', 'validate_php')) { $syntax_result = Simply_Syntax_Checker::validate_php($form_data['php_code']); if (isset($syntax_result['valid']) && $syntax_result['valid'] === false) { return 'Error de sintaxis en PHP: ' . ($syntax_result['message'] ?? 'error desconocido'); } } return true; } /** * Apply template to form data */ private static function apply_template($form_data) { $templates = self::get_templates(); if (isset($templates[$form_data['template']])) { $template = $templates[$form_data['template']]; $form_data['php_code'] = $template['code']; if (empty($form_data['description'])) { $form_data['description'] = $template['description']; } } return $form_data; } /** * Get existing snippet active status */ private static function get_existing_active_status($snippet_name) { $existing_snippet = Simply_Snippet_Manager::get_snippet($snippet_name); return $existing_snippet ? $existing_snippet['active'] : true; } /** * Almacena un error para mostrarlo después del redirect */ private static function store_error($message) { set_transient('simply_code_error', $message, 45); } /** * Muestra los errores almacenados */ private static function show_stored_errors() { $error = get_transient('simply_code_error'); if ($error) { self::show_error($error); delete_transient('simply_code_error'); } } /** * Redirecciona de vuelta a la página anterior */ private static function redirect_back() { $redirect_url = wp_get_referer(); if (!$redirect_url) { $redirect_url = admin_url('admin.php?page=simply-code'); } self::safe_redirect($redirect_url); } /** * Realiza un redirect seguro */ private static function safe_redirect($url) { // Solo limpiar si hay buffers de usuario con contenido if (ob_get_level() > 0 && ob_get_contents() !== false) { $buffer_content = ob_get_contents(); if (!empty(trim($buffer_content))) { @ob_end_clean(); } } // Verificar que no se hayan enviado headers if (headers_sent($file, $line)) { error_log("Simply Code: Headers already sent in {$file} at line {$line}, cannot redirect to: {$url}"); echo ''; exit; } // Usar wp_safe_redirect con verificación $result = wp_safe_redirect($url); if (!$result) { error_log("Simply Code: wp_safe_redirect failed for URL: {$url}"); echo ''; } exit; } /** * Redirect with success message */ private static function redirect_with_success($edit_mode, $snippet_name) { $action_text = $edit_mode ? 'actualizado' : 'creado'; $success_message = sprintf('Snippet "%s" %s correctamente.', esc_html($snippet_name), $action_text); set_transient('simply_code_success', $success_message, 45); $redirect_url = admin_url('admin.php?page=simply-code'); self::safe_redirect($redirect_url); } /** * Show error message */ private static function show_error($message) { echo '

' . esc_html($message) . '

'; } /** * Render the view */ private static function render_view($view_data) { extract($view_data); include SC_PATH . 'admin/views/snippet-editor.php'; } /** * Prepara los datos para la vista */ private static function prepare_view_data($edit_mode, $snippet_name) { $templates = self::get_templates(); // Valores por defecto $php_code = $templates['empty']['code'] ?? " $templates, 'php_code' => $php_code, 'js_code' => $js_code, 'css_code' => $css_code, 'description' => $description, 'snippet' => $snippet, 'edit_mode' => $edit_mode, 'hooks_data' => $hooks_data, 'critical_hooks' => (class_exists('Simply_Hook_Detector') && method_exists('Simply_Hook_Detector', 'get_critical_hooks')) ? Simply_Hook_Detector::get_critical_hooks() : [] ]; } /** * Get templates with caching */ public static function get_templates() { if (self::$templates !== null) { return self::$templates; } self::$templates = [ 'empty' => [ 'code' => " 'Snippet vacío' ], 'function' => [ 'code' => " 'Función personalizada' ], 'action' => [ 'code' => " 'Acción de WordPress' ], 'filter' => [ 'code' => " 'Filtro de WordPress' ] ]; return self::$templates; } }