PrestaShop max_input_vars: Por Qué los Productos con Muchas Combinaciones No Se Guardan

397 vistas

Comprender max_input_vars en PrestaShop

Si alguna vez has intentado guardar un producto con docenas o cientos de combinaciones en PrestaShop y has experimentado un fallo silencioso, un guardado parcial o un error críptico, el culpable es casi con seguridad la directiva PHP max_input_vars. Esta configuración controla cuántos campos de formulario individuales aceptará PHP en una única solicitud POST. Cuando PrestaShop envía un formulario de producto que excede este límite, cada campo más allá del umbral se descarta silenciosamente, lo que lleva a guardados incompletos, combinaciones faltantes o datos que simplemente desaparecen sin ningún mensaje de error visible.

Por defecto, la mayoría de las instalaciones PHP vienen con max_input_vars establecido en 1000. Para un simple blog o sitio informativo, esto es más que suficiente. Para PrestaShop, sin embargo, las páginas de edición de productos pueden generar miles de campos de formulario, especialmente cuando están involucradas combinaciones, campos multilingües y características personalizadas. Comprender esta directiva, saber cómo calcular el valor que tu tienda realmente necesita y aplicar la corrección correctamente te ahorrará horas de depuración.

Por Qué PrestaShop Necesita Valores max_input_vars Altos

El formulario de edición de productos de PrestaShop es uno de los formularios más complejos de cualquier plataforma de comercio electrónico. Cada combinación de un producto genera múltiples campos de entrada: uno para el impacto en el precio, uno para el impacto en el peso, uno para la cantidad, uno para la referencia, uno para el EAN-13, uno para el UPC, uno para el MPN, uno para la cantidad mínima, uno para el umbral de stock bajo, uno para la fecha de disponibilidad y varios más dependiendo de tu configuración. Una sola combinación puede producir fácilmente de 15 a 25 campos de formulario.

Ahora multiplica eso por el número de combinaciones. Una camiseta disponible en 5 tallas y 10 colores tiene 50 combinaciones. A 20 campos por combinación, eso ya son 1.000 campos solo para la pestaña de combinaciones. Añade los campos del producto base, los campos SEO para cada idioma, los valores de características, los precios específicos y otras pestañas, y puedes alcanzar fácilmente 1.500 a 2.000 campos para un producto moderadamente complejo.

Para las tiendas que venden productos con conjuntos extensos de atributos, como electrónica con diferentes capacidades de almacenamiento, colores, opciones de RAM y variantes regionales, un solo producto puede tener 200 o más combinaciones, generando más de 4.000 campos de formulario. El límite predeterminado de 1.000 ni siquiera se acerca a ser suficiente.

Síntomas de max_input_vars Demasiado Bajo

El aspecto más frustrante de alcanzar el límite max_input_vars es que PHP no genera un error. Trunca silenciosamente los datos de entrada. Esto significa que verás una variedad de síntomas confusos sin ninguna indicación clara de qué salió mal.

El síntoma más común es que las combinaciones desaparecen después de guardar. Creas 80 combinaciones, haces clic en guardar y cuando la página se recarga solo hay 40 presentes. El formulario envió las 80, pero PHP solo procesó la primera porción de los datos POST antes de alcanzar el límite, por lo que las combinaciones restantes nunca fueron recibidas por el servidor.

Otro síntoma común es que los datos del producto se guardan parcialmente. La pestaña de información básica se guarda correctamente, pero los datos de precios, SEO o combinaciones se pierden. Esto sucede porque los campos del formulario se envían en un orden específico, y cualquier campo que viene después del punto de corte se descarta.

También puedes experimentar que la página del producto simplemente se recarga sin guardar, o PrestaShop muestra un error genérico como "Se produjo un error al actualizar el producto". En PrestaShop 1.7 y 8.x, la página de producto basada en Symfony puede mostrar errores de validación para campos obligatorios que en realidad estaban completados pero fueron truncados por PHP.

Un síntoma menos obvio afecta a las tiendas multilingües. Si tu tienda soporta 5 idiomas, cada campo de texto se multiplica por 5. Un producto que se guarda bien en una tienda monolingüe falla en una multilingüe porque los campos adicionales de idiomas empujan el total más allá del límite.

Cómo Verificar Tu Valor Actual de max_input_vars

Antes de hacer cambios, verifica tu configuración actual. Crea un archivo PHP en el directorio raíz de PrestaShop (recuerda eliminarlo después por seguridad):

<?php phpinfo(); ?>

Accede a este archivo a través de tu navegador y busca max_input_vars. Verás tanto el Valor Local (lo que está actualmente activo) como el Valor Master (el predeterminado de php.ini). Presta atención al Valor Local, ya que puede diferir del Valor Master si un .htaccess o una configuración por directorio lo sobreescribe.

Alternativamente, puedes verificar desde el back office de PrestaShop. Navega a Parámetros Avanzados, luego Información. La sección de configuración PHP muestra las configuraciones PHP clave incluyendo max_input_vars. PrestaShop 1.7.7 y versiones posteriores también muestran una advertencia en esta página si el valor se considera demasiado bajo.

Calcular el Valor max_input_vars Que Necesitas

En lugar de establecer ciegamente un número alto, puedes estimar el valor que tu tienda requiere. Usa esta fórmula como punto de partida:

Valor requerido = (número de combinaciones x campos por combinación) + campos de producto base + (campos de texto x número de idiomas) + margen de seguridad

Para un ejemplo práctico, considera una tienda con 3 idiomas y un producto con 100 combinaciones. El cálculo sería: 100 combinaciones multiplicadas por 20 campos cada una equivalen a 2.000. Los campos de producto base a través de todas las pestañas contribuyen con aproximadamente 200. Los campos de texto (nombre, descripción, meta título, meta descripción, enlace reescrito y otros) multiplicados por 3 idiomas añaden otros 150. Añadiendo un margen de seguridad del 20% el total llega a aproximadamente 2.820.

Para la mayoría de las tiendas PrestaShop, establecer max_input_vars en 10000 proporciona un margen amplio. Las tiendas con productos que tienen 300+ combinaciones o que operan en 5+ idiomas deberían considerar 20000 o incluso 50000. La sobrecarga de memoria de un valor más alto es insignificante en servidores modernos.

Cómo Aumentar max_input_vars

Método 1: php.ini (Recomendado)

Si tienes acceso a la configuración PHP de tu servidor, editar php.ini es el enfoque más limpio. Localiza tu archivo php.ini (la salida de phpinfo() te dice exactamente qué archivo se carga) y encuentra o añade la siguiente línea:

max_input_vars = 10000

Después de guardar el archivo, reinicia tu servidor web o el servicio PHP-FPM para que el cambio tenga efecto. En Apache con mod_php, reinicia Apache. En Nginx con PHP-FPM, reinicia el servicio php-fpm. El comando exacto depende de tu sistema operativo y versión de PHP.

Método 2: .htaccess (Apache con mod_php o mod_fcgid)

Si no tienes acceso a php.ini, como en hosting compartido, puedes intentar añadir la directiva al archivo .htaccess en el directorio raíz de PrestaShop:

php_value max_input_vars 10000

Este método solo funciona si PHP se ejecuta como módulo Apache (mod_php). Si tu host usa PHP-FPM o CGI, esta directiva causará un error 500 Internal Server Error. En ese caso, elimina la línea inmediatamente e prueba el siguiente método.

Método 3: .user.ini (PHP-FPM / CGI)

Para servidores que ejecutan PHP-FPM, crea o edita un archivo .user.ini en el directorio raíz de PrestaShop:

max_input_vars = 10000

Ten en cuenta que los cambios en .user.ini no son inmediatos. PHP almacena en caché este archivo por un período definido por user_ini.cache_ttl, que por defecto es de 300 segundos (5 minutos). Espera al menos 5 minutos después de guardar el archivo antes de probar.

Método 4: Panel de Control del Hosting

Muchos proveedores de hosting exponen las configuraciones PHP a través de su panel de control. En cPanel, navega a "Select PHP Version" o "MultiPHP INI Editor" y busca max_input_vars. En Plesk, ve a Configuración PHP para tu dominio. DirectAdmin y otros paneles tienen opciones similares. Este es a menudo el método más fácil en hosting compartido.

La Complicación del Parche Suhosin

Suhosin es un parche de seguridad PHP que era común en servidores más antiguos, particularmente los que ejecutaban PHP 5.x. Impone su propio conjunto de límites de entrada que sobreescriben la configuración estándar max_input_vars. Incluso si aumentas max_input_vars a 10000, Suhosin puede seguir imponiendo un límite inferior a través de sus propias directivas.

Las configuraciones específicas de Suhosin que necesitas ajustar son:

suhosin.post.max_vars = 10000
suhosin.request.max_vars = 10000

Estas deben establecerse además del max_input_vars estándar. Si tu salida de phpinfo() muestra una sección Suhosin, estás afectado y debes ajustar los tres valores. Las configuraciones de Suhosin típicamente solo pueden cambiarse en php.ini, no en .htaccess o .user.ini.

En instalaciones modernas de PHP 7.x y 8.x, Suhosin está raramente presente. Si estás ejecutando una versión reciente de PHP, casi con seguridad no necesitas preocuparte por ello. Sin embargo, si estás en una cuenta de hosting compartido más antigua que no ha sido actualizada, vale la pena verificar.

Enfoques Alternativos para Productos con 500+ Combinaciones

Mientras que aumentar max_input_vars resuelve el problema inmediato, las tiendas con números extremadamente altos de combinaciones por producto deberían considerar enfoques alternativos que reduzcan el conteo de campos del formulario o eviten la limitación por completo.

Importar Combinaciones mediante CSV

La funcionalidad de importación integrada de PrestaShop procesa las combinaciones a través de la carga de archivos en lugar del envío de formularios, evitando completamente el límite max_input_vars. Prepara un archivo CSV con los datos de tus combinaciones e impórtalo a través del back office en Parámetros Avanzados, Importar. Este es a menudo el enfoque más práctico para productos con cientos de combinaciones.

Usar la API Webservice de PrestaShop

La API webservice de PrestaShop permite crear y actualizar combinaciones programáticamente. Las solicitudes API no están sujetas a max_input_vars porque usan payloads estructurados en XML o JSON en lugar de datos POST codificados como formulario. Este enfoque requiere conocimientos técnicos pero escala a cualquier número de combinaciones.

Dividir Productos Grandes

En algunos casos, tiene más sentido comercial dividir un producto con 500+ combinaciones en múltiples productos. Un producto con 5 tallas y 100 colores podría dividirse en 5 productos, uno por talla, cada uno con 100 opciones de color. Esto no solo evita la limitación técnica sino que a menudo mejora también la experiencia del cliente.

Gestionar Combinaciones en Lotes

Si debes usar el formulario del back office, crea combinaciones en lotes más pequeños. Genera 50 combinaciones a la vez, guarda, luego genera las siguientes 50. Esto es tedioso pero evita alcanzar el límite sin requerir cambios en la configuración del servidor.

Verificar la Corrección

Después de aumentar max_input_vars, verifica que el cambio haya tenido efecto. Comprueba phpinfo() de nuevo y confirma que el Valor Local coincide con lo que estableciste. Luego prueba editando tu producto más complejo, haciendo un pequeño cambio y guardando. Todas las combinaciones y datos deberían preservarse.

Si el problema persiste después de aumentar el valor, verifica estas posibilidades adicionales. Tu proveedor de hosting puede estar sobreescribiendo tus configuraciones con una configuración global. La instancia PHP que sirve tu sitio web puede ser diferente de la mostrada en un phpinfo() de CLI. Puede haber un límite del servidor web como LimitRequestBody de Apache o client_max_body_size de Nginx que también está truncando la solicitud. Algunos firewalls de aplicaciones web (WAF) o plugins de seguridad (como ModSecurity) imponen sus propios límites en el tamaño de datos POST y el número de parámetros.

Configuraciones PHP Relacionadas a Verificar

Mientras ajustas max_input_vars, revisa estas configuraciones relacionadas que también pueden causar problemas con formularios de productos grandes:

post_max_size: Establece el tamaño máximo de datos POST en bytes. Si los datos de tu formulario exceden este límite (típicamente cuando los productos tienen muchos campos de texto grandes en múltiples idiomas), el POST completo se descarta. Establece esto en al menos 32M para PrestaShop.

memory_limit: El procesamiento de miles de campos de formulario requiere memoria. Si PHP se queda sin memoria al analizar la entrada, la solicitud falla. Se recomienda un valor de 256M o 512M para PrestaShop.

max_execution_time: Guardar un producto con muchas combinaciones implica numerosas consultas a la base de datos. Si la operación de guardado tarda más que el tiempo de ejecución permitido, será terminada a mitad del proceso, llevando a guardados parciales. Establece esto en al menos 300 segundos para tiendas con productos complejos.

max_input_nesting_level: PrestaShop usa arrays anidados en los datos del formulario (por ejemplo, los campos multilingües usan arrays como name[1], name[2]). El nivel de anidamiento predeterminado de 64 es generalmente suficiente, pero si encuentras problemas con estructuras de formulario profundamente anidadas, aumenta a 128 o 256.

Notas Específicas por Versión de PrestaShop

En PrestaShop 1.6, la página del producto es completamente PHP legacy con un envío de formulario tradicional. El problema de max_input_vars afecta a todas las operaciones en la página del producto. No hay solución alternativa más que aumentar el límite o usar importaciones.

PrestaShop 1.7 introdujo una página de producto parcialmente basada en Symfony. Aunque la arquitectura cambió, el envío del formulario subyacente sigue usando datos POST y sigue estando sujeto a los mismos límites PHP. El componente de formularios de Symfony puede mostrar mensajes de error más informativos cuando faltan campos, pero la causa raíz es la misma.

PrestaShop 8.x presenta una página de producto completamente rediseñada con una nueva estructura de formulario Symfony. La gestión de combinaciones fue significativamente reelaborada, con las combinaciones ahora gestionadas a través de una interfaz dedicada que carga y guarda datos mediante AJAX en lotes más pequeños. Este cambio arquitectónico reduce naturalmente el impacto de max_input_vars para los datos de combinaciones, aunque el formulario principal del producto aún puede verse afectado en tiendas multilingües con muchas características.

PrestaShop 9.x continúa la tendencia hacia el manejo de datos basado en AJAX, reduciendo aún más la dependencia de envíos masivos de formularios. Sin embargo, max_input_vars sigue siendo relevante para operaciones masivas y módulos legacy que todavía usan envíos de formularios tradicionales.

Prevenir Problemas Futuros

Establece max_input_vars en un valor generoso durante la instalación inicial de PrestaShop en lugar de esperar a que aparezcan los problemas. Un valor de 20000 es seguro para prácticamente todos los escenarios y no tiene un impacto significativo en el rendimiento. Documenta la configuración en tus notas de configuración del servidor para que las futuras migraciones la preserven.

Si eres un proveedor de hosting o administrador de sistemas que gestiona múltiples instalaciones de PrestaShop, considera establecer max_input_vars = 20000 como predeterminado en tus plantillas de configuración PHP. Este único cambio elimina una de las solicitudes de soporte más comunes relacionadas con la gestión de productos de PrestaShop.

Monitorea tus registros de errores después de hacer los cambios. Aunque el truncamiento de max_input_vars en sí no genera errores PHP, algunas versiones de PrestaShop registran advertencias cuando detectan que los datos recibidos no coinciden con los datos esperados. Estas entradas de registro pueden ayudarte a identificar si el límite aún se está alcanzando a pesar de tu aumento.

¿Le resultó útil esta respuesta?

¿Aún tiene preguntas?

Can't find what you're looking for? Send us your question and we'll get back to you quickly.

Cargando...
Volver arriba