Gestiona la disponibilidad de las opciones reutilizables y la capacidad compartida

Las opciones reutilizables pueden tener un único estado operativo en todos los grupos de complementos de producto y productos que las utilicen. Usa la disponibilidad central para opciones que deben abrirse o cerrarse en todas partes al mismo tiempo. Activa la capacidad compartida cuando las compras completadas deban consumir un grupo discreto, incluso cuando la opción aparezca en productos distintos.

Requisitos previos

  • Activa Product Add-Ons en Settings → POM Tweaks → E-Commerce → Products.
  • Crea la opción reutilizable y vincúlala desde al menos un campo de opción múltiple o de casilla de verificación.
  • Confirma la zona horaria de WordPress en Settings → General. Las fechas de disponibilidad y las ventanas semanales usan esta zona horaria de la tienda.
  • Decide si las opciones no disponibles deben ocultarse o mantenerse visibles con una explicación.

Configura la disponibilidad central

  1. Ve a Products → Product Add-Ons → Reusable choices.
  2. Abre la opción reutilizable.
  3. En Reusable choice details, configura When this choice is unavailable para ocultarla o mantenerla visible pero desactivada.
  4. En Central availability, configura Manual state. Usa Unavailable para una parada operativa inmediata.
  5. Opcionalmente, introduce una Internal reason. Esta permanece en la administración y no se devuelve en el modelo público del producto.
  6. Opcionalmente, introduce un Customer message. Una opción desactivada muestra este mensaje, mientras que una opción oculta deja un aviso accesible en el campo que explica por qué no hay ninguna selección disponible.
  7. Opcionalmente, configura Available from y Available through. Ambas fechas son inclusivas en la zona horaria de la tienda.
  8. Activa los días de la semana necesarios en Weekly store-time windows e introduce cada hora de inicio y de fin. Una hora de fin anterior a su inicio continúa al día siguiente. Horas iguales hacen que ese día de la semana esté disponible durante sus 24 horas completas.
  9. Guarda el borrador, revisa su impacto en la publicación y publícalo.

Una opción es seleccionable solo cuando su entidad está habilitada, su estado manual está disponible, la fecha local actual de la tienda está dentro del rango configurado y la hora local actual de la tienda coincide con una ventana semanal cuando existen ventanas. La capacidad compartida se comprueba en último lugar. Las transiciones de horario de verano siguen la zona horaria de WordPress y no la zona horaria del servidor PHP.

Las referencias de productos y grupos no pueden ampliar la disponibilidad central. Una opción vinculada puede ocultarse localmente mediante su configuración de visibilidad existente, pero ningún producto o grupo puede hacer seleccionable una opción centralmente no disponible. Esta precedencia mantiene la opción reutilizable como autoritativa en todo el catálogo.

Configura la capacidad compartida

  1. En el mismo editor de la opción reutilizable, abre Shared capacity.
  2. Selecciona Limit this choice with one shared capacity across every product and group.
  3. Introduce Total capacity. Este es el grupo completo, no la cantidad por producto.
  4. Introduce Units per selection. El consumo de capacidad es este valor multiplicado por la cantidad de la línea del carrito de WooCommerce. Las cantidades fraccionarias de producto redondean el consumo al alza hasta la siguiente unidad entera de capacidad.
  5. Guarda y publica el borrador.

El editor muestra la capacidad restante actual a los administradores autorizados. Las respuestas públicas de la API REST y de la Store API exponen solo available, un motivo y un mensaje seguros, capacity_managed y el capacity_status aproximado; no exponen la capacidad original, las unidades vendidas, las cantidades retenidas ni las unidades restantes.

Cambiar Total capacity no borra el consumo. Desactivar la gestión de capacidad deja de aplicar el grupo pero conserva su historial operativo, de modo que volver a activarla no repone silenciosamente las existencias. Los reembolsos y los pedidos cancelados o fallidos devuelven sus unidades aplicables. Un cambio posterior del estado del pedido usa la cantidad que queda después de los reembolsos, por lo que no puede restaurar ni consumir las unidades reembolsadas una segunda vez.

Comprende carritos, retenciones y pedidos

Añadir una selección al carrito comprueba la disponibilidad actual, pero no reserva capacidad. Esto coincide con el comportamiento normal de WooCommerce: los carritos abandonados no bloquean a otros clientes. Si se consume capacidad mientras una selección permanece en un carrito, la validación del carrito y del pago explica que ya no está disponible e impide el pago hasta que el cliente cambie la selección.

El pago crea una retención temporal atómica para todas las opciones reutilizables gestionadas del pedido. Las retenciones usan la duración de retención de existencias configurada de WooCommerce. Los pagos simultáneos bloquean las opciones en un orden numérico determinista, de modo que solo un pago puede reservar la última unidad. Una retención pendiente deja de contar inmediatamente después de su caducidad, incluso si WP-Cron aún no ha eliminado su fila.

  • Un pago correcto o un pedido que pase a Processing, On hold o Completed confirma el consumo.
  • Una excepción en el pago libera sus retenciones temporales.
  • Un pedido Failed o Cancelled libera toda su capacidad.
  • Un reembolso parcial o total devuelve las unidades representadas por cada cantidad de línea reembolsada.
  • Reprocesar el mismo evento de reembolso no devuelve sus unidades dos veces.
  • Repetir eventos del ciclo de vida es seguro: la confirmación usa la identidad del pedido y no consume capacidad dos veces.
  • Editar los complementos de un pedido On hold editable mueve la capacidad confirmada de la selección antigua a la nueva en la misma transacción de base de datos. Si el reemplazo no tiene capacidad, tanto la línea del pedido como su asignación existente permanecen sin cambios.

Si un pago se completa solo después de que su retención temporal haya caducado, POM intenta una nueva reclamación atómica. Cuando otro pago ya ha consumido las unidades, POM no sobrecompromete el grupo. Añade una nota administrativa al pedido afectado para que la tienda pueda revisar la entrega o reembolsar el pago.

Los registros de capacidad se limitan al sitio actual del multisitio, mientras que el acceso al pedido y su estado continúan a través de la CRUD de WooCommerce. Esto mantiene el ciclo de vida compatible tanto con HPOS como con el almacenamiento clásico de pedidos.

Comportamiento de la API y de la tienda

El modelo público completo de Product Add-Ons incluye un objeto availability para las opciones reutilizables. Su schema_version es independiente del esquema de definición de Product Add-Ons. El mismo modelo actual se usa en los formularios clásicos, las respuestas de productos REST, las respuestas de productos de la Store API, la validación del carrito en el servidor y la reserva en el pago.

Cuando se selecciona Hide it from every group, la opción no disponible se omite de los controles seleccionables. El campo y el grupo circundantes permanecen en el documento, y el campo expone un mensaje de estado accesible. Cuando se selecciona Keep it visible but disabled, la opción permanece visible con su mensaje para el cliente y un control de formulario desactivado.

Las cachés estructurales de productos no almacenan disponibilidad autoritativa. Cada solicitud evalúa los horarios en la hora de la tienda y lee todas las opciones gestionadas de ese producto en una única consulta de registro acotada. Las escrituras de reserva, confirmación, liberación y reembolso omiten el estado persistente de la caché de objetos, de modo que una caché caliente no puede hacer seleccionable una capacidad agotada.

Verifica la disponibilidad y la capacidad

  1. Publica una opción reutilizable con Manual state → Unavailable y Keep it visible but disabled. Confirma que todos los productos vinculados muestran la opción desactivada y el mensaje para el cliente.
  2. Cambia el comportamiento a Hide it from every group, publícalo y confirma que el campo y el grupo permanecen con un aviso de disponibilidad.
  3. Prueba una ventana que cruce la medianoche y una fecha cercana a un cambio de horario de verano en la zona horaria configurada de la tienda.
  4. Configura la capacidad total en uno, selecciona la opción desde dos productos o sesiones distintas e inicia el pago en ambos.
  5. Confirma que el primer pago retiene la unidad y que el segundo recibe un error de disponibilidad claro.
  6. Deja caducar una retención pendiente y confirma que otro pago puede reservar la unidad antes de que se ejecute el evento de limpieza.
  7. Confirma un pedido y, a continuación, prueba las transiciones Failed, Cancelled, reembolso parcial y reembolso total mientras revisas la capacidad restante en el editor de la opción reutilizable.
  8. Abre Tools → Site Health → POM Product Add-Ons y confirma que Shared capacity ledger está Ready y que Expired-hold cleanup está Scheduled.
  9. Repite el proceso en otro subsitio del multisitio y confirma que su grupo de capacidad es independiente.
  10. Reembolsa parcialmente una línea, repite su evento de reembolso en una comprobación controlada de staging y, a continuación, mueve el pedido a través de otro estado que consuma o libere capacidad y confirma que las unidades reembolsadas no se vuelven a contar.

Solución de problemas y recuperación

Si el pago informa de que el almacenamiento de capacidad compartida no está disponible, abre la salud del sitio de Product Add-Ons. La validación de capacidad falla en modo seguro para que un error de almacenamiento no pueda crear una compra sobrevendida. Resuelve los permisos de la base de datos o la disponibilidad del esquema antes de aceptar selecciones con capacidad gestionada.

Si el evento de limpieza se retrasa, las retenciones caducadas siguen sin contar. Ejecutar el cron de WordPress más tarde las elimina en lotes acotados; no es necesario para desbloquear la capacidad.

Para una reversión no destructiva, desactiva la gestión de capacidad en la opción afectada y publica el borrador. Las instantáneas de pedidos existentes y el historial del registro permanecen intactos. Eliminar permanentemente el registro de capacidad es una operación de reversión de base de datos y solo debe realizarse después de desactivar la gestión de capacidad para todas las opciones reutilizables, de que los pagos pendientes se hayan completado o caducado, y de que se haya verificado una copia de seguridad de la base de datos.