Campos y precios de la tienda
El formulario del producto muestra las definiciones de grupo actuales resueltas por el servidor. El navegador envía los identificadores de campo y de opción, pero no decide las etiquetas, la disponibilidad ni los precios. POM Tweaks vuelve a resolver esos valores antes de añadir el producto al carrito.
Controles visuales opcionales y flujo móvil
Las muestras de texto, color e imagen son modos de presentación de las entradas de radio o casilla existentes. Seleccionar una muestra marca esa entrada nativa; no hay un segundo valor almacenado ni un precio propiedad del navegador. Sin CSS, la entrada y su etiqueta completa siguen siendo controles de formulario normales. Con CSS, cada objetivo mide al menos 44 píxeles de alto, los estados seleccionado, deshabilitado, al pasar el ratón y de foco por teclado se mantienen visibles, y las etiquetas se ajustan en lugar de crear una trampa de desplazamiento horizontal.
Las muestras de imagen usan el tamaño de adjunto de WordPress seleccionado con ancho y alto intrínsecos, srcset y sizes responsivos, carga diferida y decodificación asíncrona. La etiqueta de opción visible permanece junto a cada imagen, incluso cuando una imagen no logra cargarse. Configura texto alternativo solo para contenido de imagen significativo; déjalo vacío cuando se limite a repetir esa etiqueta. POM prepara los adjuntos y la metadata de todas las imágenes de opción resueltas antes del renderizado en lugar de consultar los medios una opción a la vez.
Un administrador puede incorporar de forma independiente un grupo a una divulgación plegable nativa o a un paso mejorado con JavaScript. Un error de campo obligatorio o de orientación del servidor abre la divulgación correspondiente y activa su paso antes de que el foco se desplace al campo. Con JavaScript desactivado, todos los grupos de paso permanecen expandidos y los grupos plegables nativos siguen funcionando.
El resumen de selección opcional enumera los campos no vacíos actuales y la misma delta de opciones mostradas emitida por el calculador de totales normal. Su región en vivo anuncia solo el total cambiante, no cada carácter escrito en un campo de texto. El modo fijo se activa mediante una consulta de contenedor solo cuando el área del formulario de producto es lo bastante ancha; las columnas de producto estrechas y los diseños móviles lo mantienen en el flujo normal del documento.
La hoja de estilos visual adicional y el script se cargan solo cuando un grupo resuelto usa una muestra, una divulgación, un paso o un resumen. Un archivo los carga cuando su proveedor de Quick View ejecuta explícitamente wc_quick_view_enqueue_scripts, porque la configuración del producto no se conoce hasta que llega la respuesta del modal. Los productos que usan solo los controles predeterminados mantienen la carga útil de la tienda existente.
Aplicar y compartir campos seleccionados mediante la URL del producto
Activa Push changes to URL en un campo de complemento individual cuando ese campo pueda representarse en una URL de producto pública. La misma aceptación controla ambas direcciones: la página canónica de producto único lee el parámetro al abrirse, y los cambios posteriores del cliente sustituyen ese parámetro en la dirección actual sin recargar la página ni añadir una entrada del historial del navegador por cambio.
POM Tweaks asigna y muestra un parámetro estable como addon-gift-wrap-a1b2c3d4 después de guardar el campo. La parte legible proviene del título original del campo, mientras que el fragmento UUID evita que grupos asignados reclamen el mismo parámetro. Los valores de elección usan los UUID de opción actuales, las selecciones de casilla usan UUID separados por comas, y los controles de texto, fecha, multiplicador y precio de cliente usan su valor introducido normalizado. El valor reservado ~ significa que el campo está deliberadamente vacío, de modo que borrar un valor predeterminado o preestablecido permanece vacío tras una recarga. Copia la dirección del navegador resultante después de configurar el producto, en lugar de construir manualmente los UUID de opción.
Una URL entrante es solo una forma de precompletar. Las condiciones actuales del campo, el estado obligatorio, la disponibilidad de las opciones, los límites numéricos y de texto, el precio del producto o de la variación, el impuesto y el precio del complemento se vuelven a resolver. Los UUID de opción desconocidos o no disponibles no se seleccionan, y el analizador normal de añadir al carrito protegido por nonce valida el formulario final. Por lo tanto, una URL no puede conservar un precio antiguo ni autorizar una opción no disponible.
Los campos de archivo y los encabezados no pueden activar este ajuste. Para otros campos de tipo texto, recuerda que los valores de URL pueden ser retenidos por el historial del navegador, las herramientas de análisis, los proxies inversos y los registros del servidor. No actives el ajuste para nombres, datos de contacto, instrucciones u otros valores sensibles a menos que esa exposición sea apropiada para el sitio. Cada valor de URL decodificado está limitado a 4 KB. Una página de producto que expone un campo aceptado envía no-referrer; cuando la solicitud ya contiene uno de sus parámetros reconocidos, también envía directivas de no almacenar en caché. Esto evita que las cachés conscientes de WordPress y los referentes salientes reproduzcan o propaguen el valor configurado.
Cuando un Product Add-On habilitado pertenece a un componente POM Composite seleccionado, su parámetro también incluye esa identidad de capítulo y componente. Esto evita que dos productos seleccionados que reutilizan el mismo grupo de complementos se sobrescriban entre sí. Deseleccionar el componente elimina sus parámetros de complemento cargados de la dirección actual. Los formularios de Quick View no actualizan una URL de archivo porque esa URL no identificaría una página de producto canónica.
Tipos de precio
- Tarifa plana añade el importe configurado una vez a la línea del carrito, con independencia de su cantidad.
- Basado en cantidad añade el importe configurado a cada unidad del producto.
- Basado en porcentaje calcula el porcentaje a partir del precio base unitario del producto y lo aplica a cada unidad.
- Precio personalizado usa siempre el importe aceptado del cliente como un precio basado en cantidad.
- Multiplicador de entrada multiplica primero el importe o porcentaje configurado y luego aplica su tipo de precio seleccionado.
¿Qué tipo de precio deberías elegir?
| Elige | Cálculo | Ejemplo con cantidad 3 | Ideal para | No lo elijas cuando |
|---|---|---|---|---|
| Tarifa plana | El importe configurado se añade una vez a la línea del carrito. | Una opción de envoltura de regalo de 5.00 añade 5.00. |
Un cargo de servicio, configuración, manipulación o embalaje por línea configurada. | Cada unidad comprada necesita su propio cargo. |
| Basado en cantidad | El importe configurado se multiplica por la cantidad de línea de WooCommerce. | Un cargo de grabado de 5.00 añade 15.00. |
Materiales por unidad, personalización, licencias o servicios. | El cargo debe quedar una sola vez para la línea completa. |
| Basado en porcentaje | El porcentaje configurado se aplica al precio base unitario autoritativo y luego se multiplica por la cantidad de línea. | Una opción de 10% sobre un producto de 40.00 añade 12.00. |
Seguro proporcional, acabado premium o niveles de servicio que deben seguir el precio del producto o de la variación. | El cliente espera un importe monetario fijo, o el precio base puede variar de una forma que el negocio no quiere reflejar. |
Precio definido por el cliente es un tipo de campo, no un cuarto Tipo de precio. El importe de cliente aceptado se comporta como precio basado en cantidad. Multiplicador de cantidad también es un tipo de campo: su número entero introducido multiplica la tarifa configurada antes de aplicar la regla de tipo de precio seleccionada.
Para productos variables, la variación seleccionada proporciona el precio base autoritativo. La página del producto muestra una confirmación ligera de Options total y Estimated total mientras el cliente hace una selección. El cálculo del carrito de WooCommerce sigue siendo autoritativo y aplica las reglas normales de impuesto y total de la tienda.
Cuando Country pricing zones está activo, cada política monetaria fija puede proporcionar opcionalmente un importe para cada zona habilitada. Esto incluye valores de opción fijos, tarifas planas, importes de cantidad, precios de elección reutilizable, importes de nivel y valores mínimo y máximo de precio personalizado. Deja vacía una entrada de zona para heredar el importe global ordinario. Los valores de porcentaje permanecen como un único porcentaje global y se calculan a partir de la base regional autoritativa del producto o de la reserva.
Desactivar temporalmente Country pricing zones, desactivar una zona o hacer que su configuración no esté disponible oculta los controles regionales correspondientes, pero no borra sus anulaciones guardadas durante una edición no relacionada de Product Add-On. Vuelve a activar la zona válida para revisar o borrar deliberadamente sus valores visibles.
El formulario del producto recibe solo los valores de zona ya resueltos y un identificador de contexto aplicado limitado. Nunca recibe el mapa privado de todos los importes de zona. El HTML de producto único almacenable en caché contiene el marcador de formulario neutral; la respuesta privada de acción de producto inserta el formulario regionalizado completo e inicializa POM Product Add-Ons una vez.
Configurar políticas económicas
Abre un grupo de Product Add-On o la pestaña Add-Ons de un producto, expande Economic policy para un campo u opción con precio y elige solo las políticas que la tienda necesita. Las definiciones existentes se normalizan a Current behavior, Discount add-on price with eligible coupons, herencia de impuesto del producto y precios por niveles desactivados, de modo que actualizar no cambia sus totales.
Los precios por niveles seleccionan una tarifa a partir de intervalos inclusivos que no se solapan. Usa WooCommerce product quantity para campos y opciones ordinarios. Un campo Input multiplier puede usar en su lugar su valor introducido para seleccionar el intervalo; la tarifa de nivel seleccionada se multiplica entonces por ese valor introducido. Una cantidad fuera de todos los intervalos usa el precio de complemento normal. Los precios personalizados introducidos por el cliente no pueden activar niveles.
La política de cupones se evalúa solo después de que WooCommerce confirme que el cupón puede descontar el producto. Exclude add-on price from coupon discounts protege esa contribución del complemento mientras WooCommerce continúa siendo propietario de las reglas de producto del cupón, los límites de uso, la asignación y la aplicación secuencial. Esto funciona para cupones de porcentaje, de producto fijo y de carrito fijo sin convertir el complemento en una tarifa.
Cada incremento de complemento hereda el estado de impuesto y la clase de impuesto del producto. Esto es fijo porque el incremento pertenece a la misma línea de WooCommerce: asignar otra clase requeriría una línea o tarifa separada y ya no coincidiría con el comportamiento de carrito, pedido, reembolso y API de Product Add-Ons.
Las políticas de cargo de suscripción están disponibles solo como un comportamiento de aceptación voluntaria:
- Current behavior (all purchases) conserva el resultado existente para compras ordinarias y cada fase de suscripción.
- Subscription initial payment only contribuye al pago inicial o de cambio, pero no a los carritos recurrentes ni a las renovaciones.
- Subscription initial and recurring payments contribuye al primer pago de suscripción y a los pagos recurrentes y renovaciones posteriores.
- One-time purchase only contribuye cuando el producto se compra sin un plan de suscripción. No contribuye cuando se selecciona un producto de suscripción fijo o un plan de All Products for WooCommerce Subscriptions.
WooCommerce Subscriptions sigue siendo responsable del prorrateo, las tarifas de alta, las pruebas, los cambios, la creación de renovaciones y los cambios de cantidad. La política aceptada y el resultado resuelto se guardan en la instantánea de línea, de modo que el historial de pedidos completados no se recalcula a partir de una definición posterior. Order again sigue siendo una compra nueva y usa la política actual.
Orden de cálculo
El mismo orden se usa en la vista previa del producto, el carrito clásico, Store API, la creación de pedidos, las suscripciones y Bookings:
| Orden | Operación | Resultado |
|---|---|---|
| 1 | Resolver el producto o la variación y el valor de cliente aceptado | Establece el precio base autoritativo, la cantidad y la selección. |
| 2 | Seleccionar un nivel | Elige la tarifa coincidente a partir de la cantidad del producto o la entrada del multiplicador; los huecos usan la tarifa de complemento configurada. |
| 3 | Aplicar multiplicadores de entrada y de Bookings | Multiplica la tarifa seleccionada por el multiplicador introducido y luego por las unidades de persona/bloque habilitadas. Las tarifas planas ignoran las unidades de Bookings. |
| 4 | Aplicar el tipo de precio del complemento | El porcentaje usa la base autoritativa; el basado en cantidad usa la cantidad de línea; la tarifa plana se aplica una vez a la línea. |
| 5 | Aplicar la fase de suscripción | Elimina las contribuciones que no pertenecen al contexto actual de compra única, inicial, de cambio, recurrente o de renovación. |
| 6 | Construir la línea de producto de WooCommerce | Añade la contribución aceptada a la línea de producto con la precisión de cálculo de WooCommerce. |
| 7 | Aplicar cupones | WooCommerce evalúa la elegibilidad y los límites; las contribuciones de complemento protegidas se eliminan de su importe descontable. |
| 8 | Aplicar el impuesto del producto y el redondeo final de moneda | WooCommerce usa el estado/clase de impuesto del producto y redondea en el límite de moneda activa. |
La fijación de precios del plan de All Products for WooCommerce Subscriptions pasa por su decisión existente de descuento de complementos durante la etapa de precio de línea. Las integraciones de moneda y precios dinámicos pueden filtrar una tarifa de servidor resuelta con pom_tweaks_product_addons_resolved_rate; la devolución de llamada recibe la política normalizada, la cantidad de nivel, el contexto de cargo, el UUID de campo/opción y la moneda. Una integración de navegador coincidente debe actualizar la vista previa por separado porque PHP nunca hace autoritativa una tarifa suministrada por el navegador. pom_tweaks_product_addons_charge_context puede adaptar una fase de carrito de servidor verificada, pom_tweaks_product_addons_order_charge_context puede adaptar la fase de una línea de pedido editable, y pom_tweaks_product_addons_coupon_discount_amount puede ajustar el resultado de cupón ya limitado sin eludir la elegibilidad de cupones de WooCommerce.
Elige cuándo aparece el total estimado
Ve a WooCommerce → Settings → Products → Add-ons. Deja Show incomplete subtotal desactivado para ocultar ambos totales en curso hasta que cada campo de complemento obligatorio sea válido y se haya seleccionado una variación. Actívalo cuando los clientes deban ver la estimación en curso mientras los campos obligatorios aún están incompletos.
Esta preferencia usa el mismo ajuste que WooCommerce Product Add-Ons, de modo que cambiar entre la extensión oficial y la tienda de POM no lo restablece. El filtro woocommerce_product_addons_show_grand_total puede seguir eliminando la región de totales completa para un producto.
La región de totales usa un anuncio en vivo cortés y se actualiza en un fotograma de animación del navegador cuando ocurren varios eventos de entrada juntos. No hace una solicitud de precios en cada pulsación de tecla. El servidor resuelve y fija el precio de forma independiente de la configuración enviada antes de que llegue al carrito.
Después de cada cálculo, el formulario del producto emite el evento nativo pom-pao-totals-updated y el evento jQuery compatible con el oficial updated_addons. El detalle incluye visibilidad, cantidad, totales de opción brutos y mostrados, totales estimados brutos y mostrados, estado de reserva y estado imponible. Las integraciones opcionales de Bookings y suscripciones alimentan sus contextos aceptados a este mismo calculador; ninguna de las extensiones es necesaria para productos ordinarios.
Impuestos, importes localizados y sufijos de precio
La vista previa sigue el contexto de visualización de la página de producto de WooCommerce en lugar de asumir que los precios almacenados y mostrados son idénticos:
- Los precios introducidos con impuestos incluidos se convierten antes de que los importes de complemento se muestren sin impuestos.
- Los precios introducidos sin impuestos se incrementan cuando la tienda muestra los precios de producto con impuestos incluidos.
- Los clientes exentos de impuestos reciben la misma visualización exenta que usa WooCommerce.
- Los productos imponibles incluyen el sufijo de precio de WooCommerce configurado, incluidas sus sustituciones
{price_including_tax}y{price_excluding_tax}. Los productos no imponibles no muestran un sufijo de impuesto. - Un producto de precio cero recibe igualmente una conversión de impuesto neutral para los importes de complemento planos, basados en cantidad y personalizados.
Los campos de precio personalizado aceptan el separador decimal actual de WooCommerce. Por ejemplo, una tienda que usa coma puede aceptar 1,50; el servidor normaliza ese valor antes de validar su mínimo y máximo configurados. Los campos de cantidad de producto y de multiplicador de entrada siguen siendo controles de número entero donde su contrato de campo lo exige.
La vista previa calcula los totales brutos y de visualización por separado. Las tarifas planas se añaden una vez por línea de carrito, los precios de cantidad y personalizados se multiplican por la cantidad del producto, y los precios de porcentaje usan el precio base del producto o de la variación seleccionada. Esto evita derivar el impuesto de un importe visible ya redondeado.
Precisión monetaria y redondeo
POM Product Add-Ons sigue la precisión de moneda activa de WooCommerce y su mayor precisión de cálculo interna. Los precios configurados, los precios personalizados aceptados y las instantáneas de selección guardadas usan valores decimales canónicos. Los cálculos de porcentaje, multiplicador, cantidad, suscripción y reserva se normalizan con la precisión de cálculo de WooCommerce antes de que las API de impuesto, cupón, carrito o pedido los reciban. Los importes orientados al cliente y del pedido final se redondean en el límite de moneda, de modo que las monedas con cero, dos o tres decimales conservan su comportamiento de WooCommerce esperado.
La vista previa del navegador usa unidades monetarias escaladas con la misma precisión interna. Esto evita artefactos binarios comunes como 0.1 + 0.2 que aparezcan en la estimación, pero no hace autoritativo al navegador. El servidor recarga el producto actual y los precios de complemento y realiza el cálculo completo de nuevo. Los ajustes negativos configurados siguen funcionando donde la definición del campo lo permite; los precios personalizados introducidos por el cliente siguen siendo no negativos.
Las tiendas que permiten cantidades de producto fraccionarias mantienen esas cantidades positivas para los complementos basados en cantidad y porcentaje. Las tarifas planas se siguen aplicando una vez a la línea. Los multiplicadores de entrada siguen siendo números enteros porque ese es el contrato de validación del campo.
Cuando una tarifa plana debe pasar por la API de precio unitario de WooCommerce, POM conserva un conjunto limitado de dígitos de asignación. Por ejemplo, una tarifa de línea de 0.10 dividida entre tres unidades se transporta como un puente de unidad y se recompone exactamente a 0.10 antes de que WooCommerce calcule los totales de línea, cupón e impuesto. Esos dígitos de guarda son internos y los valores orientados al cliente siguen usando los decimales de moneda activos.
Precios de productos de suscripción
WooCommerce Subscriptions y All Products for WooCommerce Subscriptions siguen siendo opcionales. Cuando cualquiera de las extensiones está activa, la vista previa de Product Add-Ons sigue el plan seleccionado de compra única o suscripción y mantiene los detalles de intervalo recurrente, prueba y tarifa de alta de WooCommerce junto al total estimado.
All Products for WooCommerce Subscriptions decide si un descuento de plan se aplica a los complementos. POM Tweaks sigue su decisión wcsatt_discount_addons:
- Los planes de descuento y descuento fijo aplican su regla de precio a los complementos cuando la extensión lo permite.
- Los planes de precio anulado protegen los complementos del precio del plan de forma predeterminada, de modo que la anulación sustituye el precio base del producto y los complementos siguen siendo cargos adicionales.
- Los complementos basados en porcentaje siguen usando el precio base efectivo del plan.
- Una tarifa plana sigue siendo un importe a nivel de línea en lugar de convertirse en un importe recurrente por unidad.
La misma decisión se aplica en la vista previa del producto, el carrito clásico, los bloques de carrito y finalización de compra, la metadata del pedido y los totales del servidor. El navegador solo muestra el resultado del plan seleccionado; WooCommerce y la extensión de suscripción siguen siendo autoritativos.
Productos de reserva con precio
WooCommerce Bookings y Accommodation Bookings siguen siendo opcionales. Cuando se usa cualquiera de los tipos de producto, Bookings valida primero la fecha, el recurso, la duración, las personas, la disponibilidad y el coste de reserva actual. POM Product Add-Ons aplica entonces sus precios configurados a ese coste de reserva aceptado:
- Multiply cost by person count usa el total de todos los tipos de persona seleccionados.
- Multiply cost by block or night count usa la duración aceptada seleccionada por el cliente.
- Seleccionar ambos multiplica un importe basado en cantidad o un porcentaje por ambos recuentos.
- Un porcentaje se calcula a partir del coste de reserva actual completo, incluidas las reglas de fecha y recurso seleccionadas.
- Una tarifa plana se cobra una vez e ignora ambos ajustes de multiplicador.
- La cantidad de carrito ordinaria de WooCommerce no se aplica de nuevo a los complementos de reserva.
La vista previa se recalcula después de que Bookings cambie la fecha, el recurso, la duración, las personas o el coste de reserva bruto. Usa el mismo modo de visualización de impuestos que Bookings, mientras que el servidor recalcula el importe completo de forma independiente antes de aceptar la línea de carrito. Las configuraciones existentes de Accommodation Bookings que usan su ajuste antiguo de multiplicador nocturno se siguen comportando como el multiplicador de bloque actual.
Comportamiento de validación
El formulario del producto valida cada campo después de que el cliente interactúe con él y valida el formulario de complemento completo cuando se usa Add to cart. No anuncia errores mientras un formulario intacto se está cargando. Un campo no válido recibe un mensaje cercano, aria-invalid y una relación de descripción accesible. El resumen de errores opcional enlaza a cada campo no válido, mientras que el foco del teclado se mueve directamente al primer control que necesita atención.
Los conjuntos de casillas y de elección de imagen se tratan como un único grupo de campo semántico, de modo que un conjunto obligatorio es válido cuando se marca al menos una elección disponible. La misma orientación de cliente cubre botones de opción, selectores, longitud de texto y área de texto, restricciones de letras/números/alfanuméricos/correo, precios personalizados no negativos localizados, multiplicadores de número entero, límites numéricos configurados, fechas y archivos obligatorios. Si una elección reutilizable seleccionada deja de estar disponible tras una actualización de variación o disponibilidad, el formulario borra esa selección obsoleta, explica el cambio y exige una nueva elección válida.
El resumen está habilitado de forma predeterminada. Los desarrolladores pueden eliminar solo ese resumen con pom_tweaks_product_addons_show_validation_summary; los mensajes por campo y la validación del servidor permanecen activos.
POM Tweaks repite cada regla en el servidor: campos obligatorios, identificadores de opción permitidos, elecciones deshabilitadas, longitud de texto y restricciones de contenido, límites numéricos, multiplicadores de número entero, precios personalizados no negativos y fechas de calendario válidas. Por lo tanto, los cambios del navegador no pueden aprobar un valor, UUID, estado de disponibilidad o precio que PHP rechace.
Cuando una solicitud clásica de añadir al carrito falla, los valores de texto, área de texto, fecha, número, selector, opción y casilla verificados por nonce se muestran de nuevo para que el cliente pueda corregir solo el campo no válido. Los valores predeterminados no se vuelven a aplicar silenciosamente sobre esa configuración enviada. Las entradas de archivo son la excepción deliberada porque la seguridad del navegador no permite que un sitio restaure un archivo local recién seleccionado; el cliente debe seleccionar ese archivo local de nuevo. Un archivo cargado previamente desde la sesión de carrito actual permanece disponible hasta que el cliente lo borra o lo sustituye.
Fechas y cargas de archivos
Los campos de fecha usan el control de fecha nativo del navegador, de modo que Chrome y Safari actuales presentan el selector en el idioma del visitante mientras envían un valor de calendario ISO inequívoco. POM valida ese valor YYYY-MM-DD exacto y lo formatea con el formato de fecha del sitio de WordPress para la visualización en carrito y pedido. Calcula marcas de tiempo de compatibilidad al mediodía en la zona horaria de la tienda, lo que mantiene las fechas estables a través de los cambios de horario de verano y admite años anteriores a 1970. El filtro oficial woocommerce_pao_date_input_timezone_reference acepta default para el desfase del visitante o store para el desfase de la tienda; ninguno de los ajustes cambia el día de calendario seleccionado.
El control Clear elimina la fecha sin necesidad de un ratón. Un archivo seleccionado muestra su nombre y tamaño formateado junto a la entrada, y Clear elimina esa nueva selección del navegador. Las cargas de archivos se comprueban contra los errores de carga de PHP y WordPress, el tamaño real del archivo temporal, el límite de tamaño de WordPress y multisitio, la extensión permitida y el tipo MIME detectado a partir del contenido del archivo. Las extensiones dobles que contienen tipos ejecutables o de contenido activo se rechazan incluso cuando su extensión final parece permitida.
Los archivos aceptados reciben un identificador opaco y se almacenan fuera de la raíz web pública de forma predeterminada. Las pantallas de carrito y pedido generan enlaces de descarga que caducan; el controlador de descarga verifica entonces la firma y la sesión de carrito actual, la propiedad del pedido, la clave de pedido de invitado o la capacidad de gestión de WooCommerce antes de devolver bytes. Un identificador de archivo o una URL antigua por sí solos nunca conceden acceso, y las solicitudes no autorizadas o ausentes reciben la misma respuesta no enumerable.
Abrir un elemento configurado desde el carrito muestra la carga existente como un enlace fuera de la entrada de archivo. El navegador envía solo una elección de conservar-o-borrar; POM recupera el identificador opaco de esa sesión de carrito y nunca confía en una URL o ruta oculta del navegador. Seleccionar un archivo de sustitución reemplaza la carga anterior después de que la actualización del carrito o del pedido se realice correctamente. Borrar una carga obligatoria existente hace que un archivo nuevo sea obligatorio. El editor de línea de pedido sigue la misma regla en Saved selections y nunca intenta rellenar input.files.
Los clientes personalizados de Store API no pueden enviar un cuerpo de archivo dentro de la extensión JSON de añadir al carrito. Primero envía una solicitud multiparte file a POST /wp-json/pom-tweaks/v1/product-addons/files con un nonce REST de WordPress válido, un nonce de Store API o el Cart-Token actual de Store API. Un cliente sin interfaz debe enviar el mismo Cart-Token a esta carga y a la solicitud de carrito posterior para que ambas operaciones resuelvan un único propietario de carrito. La respuesta contiene un file_id, el nombre saneado, el tipo MIME detectado y el tamaño, pero ninguna URL pública. Envía ese file_id como el valor del campo de archivo en la solicitud normal de añadir al carrito. POM verifica que el identificador pertenece a la misma sesión de WooCommerce y repite las comprobaciones de extensión y tamaño específicas del campo. Las URL HTTP arbitrarias se rechazan.
Las cargas temporales que nunca llegan a una línea de carrito aceptada caducan después de un día. Las cargas de carrito activas caducan después de siete días a menos que la sesión de carrito las actualice. Los archivos de pedido permanecen con el pedido y se eliminan cuando el último pedido vinculado se elimina permanentemente o cuando WooCommerce elimina los datos personales de ese pedido. La limpieza se ejecuta en pequeños lotes diarios bajo un bloqueo que caduca; por lo tanto, una sustitución fallida no puede eliminar el archivo aceptado anteriormente y su sustitución no utilizada se elimina más tarde.
El almacén local predeterminado debe permanecer fuera de la raíz del documento público y debe incluirse en las copias de seguridad junto con la base de datos. Una integración de descarga de medios puede implementar pom_tweaks_product_addons_store_file, pom_tweaks_product_addons_download_file y pom_tweaks_product_addons_delete_file; las tres devoluciones de llamada deben usar la clave de almacenamiento opaca y nunca deben devolver una URL permanente sin restricciones. pom_tweaks_product_addons_private_upload_directory puede reubicar el almacenamiento local a otro directorio no público. Prueba la restauración y la eliminación antes de activar un adaptador en producción.
Las instantáneas antiguas de POM y del Product Add-Ons oficial se migran de forma diferida cuando una vista de carrito o pedido autorizada necesita el archivo. POM copia el archivo heredado local conocido al almacenamiento privado y mantiene la metadata original y el archivo de origen intactos para la reversión. Los archivos de denegación de Apache e IIS se añaden a los directorios de carga heredados conocidos donde se puede escribir. Nginx y otros servidores que ignoran esos archivos deben denegar el acceso HTTP directo a las ubicaciones de carga heredadas de Product Add-Ons en la capa de alojamiento. Después de que los pedidos históricos representativos se descarguen correctamente y exista una copia de seguridad sincronizada de base de datos/archivos privados, los archivos antiguos pueden archivarse o eliminarse mediante una operación de mantenimiento de alojamiento controlada; POM no los elimina en masa automáticamente.
Compatibilidad con Quick View
POM Product Add-Ons admite tanto WooCommerce Quick View como el Quick View de producto POM Theme sin requerir ninguno de los proveedores.
- WooCommerce Quick View pide a las integraciones que pongan en cola sus recursos de archivo mediante
wc_quick_view_enqueue_scripts. POM Tweaks responde solo a esa solicitud y luego inicializa cada formulario de complemento insertado por AJAX. También admite el evento de navegador del proveedorquick-view-displayed. - POM Theme abre la URL de producto normal en un marco aislado de Quick View. Por lo tanto, la página de producto carga sus propios recursos de complemento dentro de ese marco; el archivo de la tienda circundante no recibe una copia innecesaria.
- Los formularios insertados después de la carga de la página se inicializan una vez. Eliminar un modal también elimina sus escuchadores de Product Add-Ons, los manejadores de variación, la actualización de total pendiente y el observador de disponibilidad antes de abrir un producto posterior.
- Cada producto abierto mantiene su propio formulario, nonce, valores UUID, estado de validación, control de carga, precio de variación y contexto de subtotal. Los valores de un modal cerrado no se reutilizan en el siguiente.
Una integración personalizada de Quick View por AJAX debe ejecutar la acción de WordPress wc_quick_view_enqueue_scripts en las solicitudes de archivo y disparar quick-view-displayed en document.body después de insertar el formulario de producto. El evento puede pasar el elemento insertado o el objeto jQuery como su segundo argumento. POM Tweaks también detecta formularios insertados mientras su script cargado condicionalmente está presente, pero la acción oficial de puesta en cola sigue siendo necesaria para que un archivo no tenga que cargar Product Add-Ons globalmente.
Resultado en carrito y pedido
Cada valor aceptado se muestra debajo de su línea de carrito. Las selecciones con valores diferentes siguen siendo configuraciones de carrito distintas. El pedido conserva los valores aceptados orientados al cliente para que los detalles históricos no dependan de ediciones posteriores de etiquetas o precios.
Cambiar o deshabilitar una elección reutilizable afecta a los nuevos envíos, a las sesiones de carrito restauradas y a los productos añadidos mediante Order again. No reescribe pedidos completados.
Verificación
- Añade un producto con una opción fija basada en cantidad y establece la cantidad del carrito en dos. Confirma que el importe de la opción se cobra dos veces.
- Añade una opción de tarifa plana, aumenta la cantidad y confirma que esa tarifa se cobra una vez para la línea.
- Añade una opción de porcentaje y confirma que sigue el precio base del producto o de la variación seleccionada.
- Añade niveles
1–2,3–5y6+, cambia la cantidad de línea en cada límite y confirma que una cantidad no cubierta usa la tarifa alternativa configurada. - Aplica un cupón de porcentaje, de producto fijo y de carrito fijo a una línea que contenga una opción descontable y una protegida; confirma que solo se descuenta el importe permitido.
- Repite con precios de tienda con y sin impuestos incluidos y confirma que el incremento completo hereda la clase de impuesto del producto.
- Si Subscriptions está activo, realiza cálculos inicial, recurrente, de renovación y de cambio con políticas solo inicial y recurrente. Si All Products for WooCommerce Subscriptions está activo, repite con su plan de compra única seleccionado.
- Envía cada campo obligatorio vacío y confirma que el primer control no válido recibe el foco, cada campo no válido expone
aria-invalidy un mensaje cercano, y el resumen enlaza de vuelta a cada control. - Prueba una elección reutilizable no disponible alterando el identificador de opción enviado y confirma que el servidor la rechaza.
- Si las cargas están habilitadas, selecciona un archivo permitido y confirma que aparecen su nombre y tamaño. Bórralo y luego prueba un archivo demasiado grande, un MIME falso, una extensión activa doble, un archivo renombrado y un tipo no permitido; confirma que los mensajes de campo y de servidor identifican el campo de carga.
- Completa un pedido de prueba y confirma que cada valor aceptado aparece en la metadata de línea del pedido.
- En un producto de reserva, selecciona dos bloques y tres personas. Confirma que los campos de persona, bloque, porcentaje combinado y tarifa plana actualizan la vista previa, y luego confirma que el total del carrito coincide con ella.
- En un producto de suscripción nativo, selecciona complementos y confirma que el total estimado conserva los detalles del intervalo recurrente.
- En un producto de All Products for WooCommerce Subscriptions, compara un plan de descuento y un plan de precio anulado. Confirma que los complementos reciben o evitan el ajuste del plan según la política WCS_ATT configurada.
- Deja Show incomplete subtotal desactivado, borra un campo obligatorio y confirma que la región de totales está oculta. Activa el ajuste y confirma que la estimación en curso permanece visible para el mismo formulario incompleto.
- Prueba precios introducidos con y sin impuestos frente a ambos modos de visualización de la tienda. Repite con un cliente exento de impuestos y confirma que la vista previa sigue el precio del producto de WooCommerce en cada caso.
- En un producto de precio cero, combina una tarifa plana, un precio basado en cantidad, un porcentaje, un precio personalizado localizado, una cantidad de producto mayor que uno y un multiplicador de entrada. Confirma que la vista previa y la línea de carrito aceptada coinciden.
- Solo con el teclado, corrige un conjunto de casillas obligatorio, texto restringido, precio personalizado, multiplicador, fecha y campo de archivo. Confirma que los errores aparecen solo después de la interacción o el envío y desaparecen a medida que cada valor se vuelve válido.
- Provoca un rechazo del servidor después de completar varios campos válidos. Confirma que la página conserva cada valor enviado excepto la selección de archivo local y no restaura los valores predeterminados del campo sobre la configuración enviada.
- Deshabilita una elección reutilizable seleccionada mediante una integración de variación o disponibilidad y emite
pom-pao-availability-changeden el formulario del producto. Confirma que el valor obsoleto se borra y el campo se vuelve a validar. - Abre un producto simple con complementos mediante Quick View, selecciona valores, añádelo al carrito, cierra el modal y repite con otro producto. Confirma que el segundo formulario tiene valores, UUID, nonce, subtotal y estado de validación independientes.
- Repite Quick View con un producto variable, incluida una variación predeterminada, cambios de variación, una elección de imagen y un campo de carga. Confirma que la variación seleccionada actualiza la vista previa y que la línea de carrito aceptada contiene la misma configuración.
- Abre y cierra el mismo Quick View varias veces. Confirma que ocurren un cálculo de Product Add-Ons y una solicitud de añadir al carrito por interacción, y luego confirma que una página sin un proveedor de Quick View de producto no carga la hoja de estilos o el script de Product Add-Ons.
- En español e inglés en Chrome y Safari actuales, selecciona y borra una fecha ordinaria, una fecha a través de un límite de horario de verano y una fecha anterior a 1970. Confirma que el valor ISO y el día formateado de carrito y pedido permanecen idénticos.
- Abre un elemento del carrito con una carga existente. Consérvala sin volver a seleccionar un archivo, sustitúyela y luego bórrala. Confirma que la validación obligatoria aparece solo después de borrar la carga existente y que ninguna entrada de archivo se rellena nunca previamente.
- Combina precios
0.1y0.2, un porcentaje, un multiplicador, cantidad mayor que uno, impuesto y un cupón. Confirma que la vista previa, el carrito, la metadata del pedido y la respuesta REST del pedido contienen importes decimales normalizados sin residuos binarios largos. - Repite la comprobación monetaria con monedas configuradas para cero, dos y tres decimales. Confirma que los totales de visualización y pedido usan los decimales de moneda activa mientras que los precios brutos de Store API conservan la mayor precisión de cálculo de WooCommerce.
- Completa una carga como invitado. Confirma que la misma sesión puede descargarla desde el carrito, que un navegador diferente recibe la respuesta genérica no disponible, que el enlace de pedido de invitado funciona con su clave de pedido y que un administrador de WooCommerce autorizado puede descargarlo.
- Crea una carga temporal no utilizada, una carga de carrito abandonada y una sustitución fallida. Adelanta sus TTL filtrados en el entorno de pruebas, ejecuta la limpieza programada y confirma que solo se eliminan los archivos caducados no referenciados.
- Compara un campo predeterminado con muestras de texto, color e imagen con la hoja de estilos opcional habilitada y bloqueada. Confirma que cada caso envía los mismos valores de opción o casilla respaldados por UUID.
- Solo con teclado, desplázate por muestras, opciones deshabilitadas, un grupo obligatorio plegado y un flujo de pasos de varios grupos. Envía un paso incompleto y confirma que su divulgación se abre antes de que el control no válido reciba el foco.
- Activa el resumen de selección en un contenedor de producto estrecho y ancho. Confirma que el modo fijo se activa solo en el contenedor ancho, que la delta de opciones coincide con Options total y que escribir no anuncia el resumen completo repetidamente.
- Repite las comprobaciones visuales en Storefront, POM Theme, un tema Bootstrap, Quick View y un producto variable. Desactiva JavaScript y confirma que cada paso está expandido y que añadir al carrito sigue siendo utilizable.
- Activa Push changes to URL en un campo de selector, casilla, texto, fecha, multiplicador y precio personalizado. Cambia y borra cada valor, recarga la URL copiada y confirma que vuelven los mismos valores actuales mientras que el valor reservado
~borra los valores predeterminados. - Altera un UUID de opción en la URL, deshabilita la opción seleccionada y cambia su precio. Confirma que la selección no válida no se aplica y que la línea de carrito aceptada siempre usa el precio actual del servidor.
- Activa el ajuste en un campo condicional, hazlo inactivo y confirma que su valor de URL queda vacío y no puede aportar un valor obligatorio, precio, valor de carrito o valor de pedido mientras esté inactivo.
- Confirma que los campos de archivo y encabezado no pueden activar la sincronización de URL, que Quick View no reescribe su URL de archivo y que un complemento de componente habilitado recibe un parámetro contextual distinto para cada componente Composite seleccionado. Inspecciona los encabezados de respuesta con y sin un parámetro reconocido: ambas respuestas de producto usan
no-referrer, mientras que solo la solicitud configurada recibe directivas de no almacenar en caché. - Guarda un campo, opción, nivel y elección reutilizable con valores regionales. Desactiva temporalmente Country pricing zones, edita una etiqueta no relacionada, guarda y luego vuelve a activar las zonas y confirma que cada valor regional sigue presente. Borra un valor de zona visible y confirma que solo se elimina esa anulación deliberada.
Resolución de problemas y reversión
-
Si las cargas informan de que el almacenamiento privado no está disponible, pide al alojamiento que proporcione un directorio escribible fuera de la raíz del documento público o configura un adaptador de descarga compatible. No recurras a un directorio direccionable públicamente.
-
Si una URL heredada sigue siendo directamente accesible en Nginx u otro servidor no Apache, añade una regla de alojamiento que deniegue las ubicaciones de carga heredadas de Product Add-Ons antes de migrar pedidos históricos.
-
La reversión no requiere cambiar las instantáneas de pedido: desactiva el nuevo adaptador de almacenamiento o restaura la base de datos y la copia de seguridad de archivos privados desde el mismo punto de recuperación. Mantén los archivos de origen heredados hasta que la verificación de descarga histórica esté completa.
-
Si los campos no aparecen, confirma que el producto coincide con el alcance del grupo y que el grupo está habilitado.
-
Si la extensión oficial WooCommerce Product Add-Ons está activa, su tienda tiene prioridad y la tienda de POM Tweaks permanece inactiva.
-
Si un tema personalizado sustituye la plantilla clásica de añadir al carrito sin su enganche estándar, restaura el enganche o usa una plantilla de producto compatible.
-
Si un Quick View por AJAX muestra campos sin comportamiento, confirma que el proveedor ejecuta
wc_quick_view_enqueue_scriptsantes del pie del archivo y emitequick-view-displayeddespués de insertar el formulario. El Quick View basado en marcos de POM Theme no necesita ese evento. -
Si una vista previa de reserva no se actualiza, confirma que WooCommerce Bookings está activo, que el producto es de reserva o reserva de alojamiento, y que Bookings puede devolver un coste actual para la fecha y el recurso seleccionados.
-
Si una vista previa de suscripción no cambia con el plan seleccionado, confirma que las opciones de suscripción aparecen dentro del mismo formulario de producto de WooCommerce y que el producto tiene una definición actual de POM Product Add-Ons.
-
Para revertir inmediatamente, desactiva Product Add-Ons en Settings → POM Tweaks. Esto no elimina grupos, elecciones reutilizables ni valores históricos de pedido.
Relacionado: Crear grupos y elecciones reutilizables y persistencia del carrito y del pedido.