El desarrollo de esta versión ha costado 4.250 euros. El coste de la primera versión fue de 38.000 euros. El coste acumulado desde la primera versión es de 46.610 euros, pero el coste para ti es solo la licencia desde 80€.
Nueva rama 3.0.x del plugin Advanced Subscriptions for WooCommerce. Es una versión mayor: estrena las opciones de compra en la ficha de producto («Compra única» o «Suscríbete y ahorra»), el descuento opcional Suscríbete y ahorra con reglas propias, la traducción completa al español y la posibilidad de que el cliente cambie la cantidad y la frecuencia de su suscripción desde Mi cuenta. Además, trae una auditoría de seguridad completa y una larga lista de correcciones en renovaciones, cambios de plan, descuentos y pasarelas de pago.
Versiones de la rama
3.0.0
Importante:
- Actualización recomendada para todas las tiendas: incluye correcciones de seguridad y de cobros en las pasarelas incluidas, en Mi cuenta y en las renovaciones.
- El selector «One-time purchase / Subscription» que aparecía bajo el precio desaparece y lo sustituye el nuevo widget de opciones de compra. Si tu tema o algún fragmento de código dependía de él, revísalo antes de actualizar.
- El módulo de fecha de inicio personalizada (Custom Start Date) queda desactivado en la 3.0.0 y su sección de ajustes no se muestra, también en las tiendas que lo tenían activado: mostraba la fecha elegida, pero la suscripción empezaba y se cobraba en el momento. Volverá, terminado, en una versión posterior.
- El correo de recordatorio de renovación viene desactivado por defecto. Si lo tenías guardado como activado, se desactiva una vez al actualizar para que tus clientes no reciban correos por sorpresa; puedes volver a activarlo cuando quieras.
- Al actualizar, las suscripciones que se habían quedado en «Pendiente de cancelar» se cancelan en su siguiente fecha de pago, o en las doce horas siguientes si esa fecha ya ha pasado. Recibirás entonces sus correos de cancelación.
- Al actualizar, las suscripciones activas con la fecha del siguiente pago en el pasado y nada programado pasan a cobrarse en la siguiente fecha de su ciclo. El periodo vencido no se cobra y queda una nota en la suscripción.
Nuevo:
- Opciones de compra en la ficha de producto: «Compra única» o «Suscríbete y ahorra», como un grupo de opciones nativo y manejable con el teclado, con el ahorro destacado en una etiqueta. Funciona en productos simples y variables (por variación) y en temas clásicos y de bloques. La opción preseleccionada se elige en los ajustes.
- Suscríbete y ahorra (desactivado por defecto; nada cambia hasta que lo actives): el precio de la suscripción es el precio normal del producto menos un porcentaje (del 1 % al 50 %), que puede venir de un ajuste del producto o de la variación, de la primera regla que coincida o del ajuste global. Puedes descontar también el primer pedido y limitar el número de pedidos con descuento. Todo se guarda en la suscripción al darse de alta, así que cambiar los ajustes más adelante nunca cambia su precio.
- Nueva pantalla WooCommerce › Subscribe & Save con reglas ordenadas por condiciones (precio por encima o por debajo de un importe, categoría, etiqueta o productos concretos). Gana la primera regla que coincide. Las reglas se pueden subir, bajar, arrastrar para reordenarlas y borrar en dos pasos.
- El cliente puede elegir la frecuencia de entrega dentro de los periodos y límites que permita la tienda, salvo que el producto la tenga bloqueada.
- En el carrito clásico, cada línea que lo admite se puede cambiar entre compra única y suscripción, con su frecuencia. Los totales del carrito y del pago (clásicos y de bloques) muestran una fila con el ahorro de Suscríbete y ahorra.
- En Mi cuenta, el cliente puede cambiar la cantidad y la frecuencia de su suscripción. El cambio se aplica desde la siguiente renovación, con una vista previa del nuevo importe y de la nueva fecha.
- Cada línea de un producto que ofrece las dos opciones muestra «Compra: compra única» o «Compra: suscripción», con sus condiciones, en el carrito, el pago (clásico y de bloques), el pedido, Mi cuenta, la confirmación del pedido y los correos. Una suscripción de N unidades se crea y se renueva por N unidades.
- Los tramos de descuento de renovación pueden sumarse al descuento de Suscríbete y ahorra o aplicarse después de él: primero Suscríbete y ahorra mientras dure y luego los tramos (es un ajuste). Un cambio de plan toma los tramos del producto nuevo.
- Traducción al español de España (es_ES) incluida: todo el plugin, con las pasarelas incluidas de Redsys, Bizum, Google Pay e Inespay. Una tienda en español ya no muestra textos en inglés en el pago, en Mi cuenta, en los correos ni en los ajustes.
- Al actualizar, las suscripciones que se renuevan con un ciclo distinto al de su producto aparecen en un aviso de administración con el botón «Align with the product» para alinearlas.
Arreglado:
- Las traducciones incluidas en la carpeta
languages/del plugin se cargan de verdad. En WordPress 6.7 y posteriores se buscaban en una carpeta que no existe, así que solo se aplicaban las instaladas enwp-content/languages/plugins/. - Una suscripción cancelada por el cliente en Mi cuenta, o por la tienda desde la administración, ahora termina de verdad. Si no tenía fecha de fin se quedaba para siempre en «Pendiente de cancelar»: nunca se cancelaba, el correo de suscripción cancelada no salía y una tienda que da acceso según el estado de la suscripción seguía dándolo. Ahora se cancela cuando termina el periodo ya pagado. Nuevo filtro
aswc_prepaid_term_end. - Un reintento de pago cobra cada periodo como mucho una vez. Con un cobro pendiente, o con uno que expiró después de que el banco lo aprobara, el reintento podía crear y cobrar una segunda renovación del mismo periodo.
- Cuando un reintento paga una renovación fallida con un pedido de renovación nuevo, el cliente ya no puede pagar también el pedido fallido (en el pago, en Mi cuenta o con la acción de administración «Retry pending order payment»). Si ya había un pago en marcha cuando se ejecutó el reintento, se marca en los dos pedidos para que decidas el reembolso.
- Dos ejecuciones de renovación simultáneas para la misma suscripción (varios lotes de Action Scheduler, o un ejecutor de WP-CLI junto a WP-Cron) ya no pueden cobrarla las dos.
- Stripe: una renovación cuya respuesta se pierde (un tiempo de espera agotado, un servidor que se detiene a mitad de la petición, un error de un proxy) ya no se marca como fallida, lo que la dejaba pagable y permitía que un reintento cobrara el periodo dos veces. Ahora queda en espera con una nota en el pedido, no se vuelve a cobrar mientras tanto y se consulta en Stripe una hora después: se completa si el cobro se hizo y pasa a los reintentos normales si no.
- Stripe: mientras una renovación está retenida a la espera de confirmar su cobro, reactivar la suscripción ya no permite que la siguiente ejecución cree y cobre otra renovación del mismo periodo. La retención también queda anotada en la suscripción.
- Stripe: un aviso tardío de «pago fallido» ya no hace fallar una renovación que ya está pagada. Stripe y PayPal: una renovación ya no vuelve a poner la tarjeta que el cliente había sustituido.
- PayPal: cuando PayPal no responde (tiempo de espera agotado, error de conexión o error del servidor), la renovación queda retenida para que la revises, en lugar de marcarse como fallida y reintentarse, lo que podía cobrarla dos veces.
- PayPal y WooPayments: una renovación nunca se queda pagable cuando el plugin de pago falla con un error interno después de enviar el cobro. Las de PayPal quedan retenidas para que las revises y las de WooPayments se concilian. Antes, un reintento podía cobrarlas por segunda vez.
- Una suscripción sin un ciclo de facturación válido ya no se renueva cada día: toma el ciclo de su producto o se pone en espera y nunca se cobra. Tampoco la cobra un reintento de pago ni las acciones manuales de la tienda (Create Pending Renewal Order, Retry Pending Order Payment y Retry Renewal Payment), que ahora la rechazan con una nota.
- Al actualizar a la 3.0.0, las suscripciones sin ciclo de facturación toman el de su producto.
- El intervalo de facturación de un producto de suscripción, y el de cada variación, ya no viene preseleccionado en «Días»: hay que elegirlo, o el producto no se guarda como suscripción.
- El «Payment» y el «Billing Period» de una suscripción existente se guardan desde su caja de programación, y un ciclo vacío ya no se muestra como «Días».
- Las comprobaciones del ciclo de facturación aceptan periodos añadidos por otros plugins, nunca modifican una suscripción solo por mostrarla y envían a la tienda como mucho un correo al día sobre suscripciones sin ciclo.
- Una suscripción con periodo de prueba se renueva el día en que terminó la prueba, no el día en que se compró (el segundo cobro llegaba menos de un mes después del primero).
- Una suscripción nueva queda fechada en el momento real en que se crea. Su fecha de creación era la hora local de la tienda guardada como UTC, así que en una tienda al este de UTC aparecía más tarde de lo real (dos horas en España en verano) y las suscripciones nuevas se ordenaban por debajo de otras más antiguas. Las suscripciones creadas antes de la 3.0.0 conservan su fecha.
- Un pedido de renovación que paga el cliente queda registrado: una renovación fallida pagada en la página de pago del pedido, o una renovación manual, mueve ahora la fecha del siguiente pago un intervalo y programa ese pago. Antes la suscripción volvía a activa sin nada programado y no se renovaba nunca más.
- Una renovación sin nada que pagar (un cupón recurrente del 100 %) se registra como cualquier otra: la suscripción sigue activa y su siguiente renovación queda programada.
- La comprobación diaria de la programación restaura la acción de pago que falte en las tiendas con almacenamiento de pedidos de alto rendimiento (HPOS). Buscaba las suscripciones solo entre las entradas y no encontraba ninguna.
- Una suscripción o un pedido cancelado, reembolsado o caducado después de programar su fecha de inicio ya no se activa cuando llega esa fecha.
- Una suscripción eliminada, cancelada por un administrador o reembolsada mientras una renovación fallida espera su reintento ya no mantiene ese reintento programado.
- Reactivar una suscripción pausada en Mi cuenta ya no programa un reintento de pago.
- Un reembolso total del primer pedido de una suscripción vuelve a cancelarla. La tienda trataba ese primer pedido como una renovación, así que un cliente reembolsado seguía suscrito y se le cobraba en la siguiente renovación.
- Los tramos de descuento de renovación llegan a todas las renovaciones para las que se configuraron: el contador de renovaciones pagadas no avanzaba nunca, así que un tramo que empezaba en la segunda renovación o más tarde no se aplicaba nunca. Ahora cada renovación pagada cuenta una vez, y una renovación reembolsada sigue contando.
- Editar los tramos de descuento de renovación de un producto ya no cambia el precio de las suscripciones existentes. Los tramos se guardan al empezar la suscripción y se mantienen tal como se vendieron, también los de los cupones.
- Los tramos de descuento de renovación configurados en un cupón, y los tramos por rol de cliente, se aplican ahora a las renovaciones. Se guardaban, pero nunca se usaban. Los de un cupón también se aplican en un producto sin tramos propios, aunque «Override Product Discounts» esté desmarcado.
- El pago ya no termina con un error fatal cuando el producto tiene tramos de descuento de renovación.
- El descuento del primer pago se aplica una sola vez y solo en el primer pago. Se aplicaba dos veces y se arrastraba a todas las renovaciones. No se aplica a un periodo de prueba ni a un cambio de plan.
- Un producto con descuento en el primer pago muestra en el pago su precio real de renovación. Los dos checkouts mostraban el primer pago con descuento como precio de todas las renovaciones, aunque las renovaciones se cobraban al precio completo.
- Un producto con periodo de prueba comprado con un cupón recurrente se renueva a su precio con descuento. Se guardaba con un importe de renovación de 0 y se renovaba gratis.
- La cuota de alta se cobra una vez por suscripción, sea cual sea la cantidad. Una suscripción comprada con cantidad 3 pagaba la cuota tres veces.
- Con los precios introducidos con impuestos incluidos, el total recurrente de la suscripción se guarda redondeado a los decimales de la tienda.
- Cambios de plan: el cambio se cobra en la fecha del siguiente pago que muestra la suscripción, y la nueva fecha se cuenta desde el cambio (antes una mejora regalaba un periodo entero). Un cambio nunca concede el periodo de prueba del producto nuevo; el crédito del periodo no usado es lo que realmente se pagó por él; se rechaza una segunda línea de cambio para la misma suscripción y un pedido de cambio confirmado dos veces a la vez se aplica una sola vez.
- Cambios de plan con prorrateo: el crédito de la suscripción anterior se aplica una vez por línea, no una vez por unidad.
- Un cambio de plan a una variación que toma el periodo de facturación del producto variable se reconoce como lo que es. Antes se trataba siempre como una bajada de plan, fueran cuales fueran los precios.
- Una bajada de plan a una variación que hereda el intervalo de su producto padre recibe su crédito. Se calculaba como infinito y nunca se aplicaba.
- Un cambio de plan mantiene la facturación de una suscripción sin fecha de fin cuando su crédito se añade como días, empieza el nuevo periodo el día del cambio y conserva los tramos de descuento de un cupón de alta.
- «Stop Downgrade» y «Allow switching only to the same interval» están desactivados salvo que los marques. Una vez guardados los ajustes, se leían como activados y se rechazaban todas las bajadas de plan y todos los cambios entre intervalos.
- Día de renovación sincronizado: la primera renovación mensual es el día de este mes si aún no ha pasado; todas las renovaciones se mantienen en ese día; la ficha de producto anuncia la fecha que se cobra; «Último día del mes» renueva el último día de cada mes, y un sitio al este de UTC ya no adelanta un día la primera renovación al final de su jornada.
- «Let the customer choose the expiry» en una suscripción variable: el campo de caducidad ofrece el periodo de facturación del producto (antes caía en «Días») y se rechaza una caducidad más corta que el intervalo de facturación. Lo mismo se aplica a una suscripción creada desde una venta adicional de CartFlows.
- El límite de cancelaciones de periodos de prueba de un producto se aplica: tras el número indicado de pruebas canceladas, el cliente ya no puede cancelar la siguiente.
- El bloque de Pago muestra en el resumen del pedido el periodo de facturación («/ 1 mes»), como ya hacía el bloque de Carrito.
- Las cifras de renovación del bloque de Pago siguen al carrito: tras un cupón o un cambio de cantidad o de envío ya no se quedan con los importes anteriores hasta recargar la página.
- Bloque de Pago: el primer cobro de una prueba gratuita (la cuota de alta, o nada) ya no aparece como una oferta. La línea muestra lo que se cobra ahora, la prueba y el precio de renovación.
- Un producto variable que mezcla variaciones de suscripción y de compra única ya no muestra su rango de precios con un periodo de facturación, lo que presentaba el precio de compra única como mensual. Nueva función auxiliar y filtro
aswc_variable_product_has_one_time_variation(). - El icono de tarjeta de Redsys (y los iconos por defecto de las demás pasarelas incluidas) ya no ocupa toda la caja de pago en el checkout clásico con un tema de bloques. Tu propio logotipo no se toca.
- Pasarela Redsys incluida: una renovación cobrada con la tarjeta guardada ya no la guarda otra vez. Cada renovación añadía otra tarjeta idéntica a la cuenta del cliente. Al actualizar se eliminan los duplicados que guardaron las versiones anteriores, conservando la que usan las renovaciones.
- Redsys: una renovación cobra la tarjeta guardada más reciente del cliente, no la más antigua, y una tarjeta ya guardada nunca se vuelve a guardar en clientes con más de diez tarjetas.
- Una cancelación en Redsys, Bizum o Google Pay cancela el pedido en la tienda. Antes se quedaba pendiente.
- Los pagos con contra reembolso, transferencia o cheque, y las suscripciones manuales, envían al cliente la factura de renovación con el enlace para pagarla. Antes el cliente no sabía nada hasta que la tienda usaba «Retry Renewal Payment». Nuevo filtro
aswc_send_manual_renewal_invoice. - «Retry Renewal Payment» vuelve a ofrecerse en un pedido de renovación pendiente, y el correo que recibe la tienda sobre una renovación fallida indica que es una renovación y nombra su suscripción.
- La tienda recibe una sola vez el correo de una renovación fallida. El plugin enviaba su propia copia junto a la de WooCommerce.
- El correo de recordatorio de renovación se envía antes de la renovación cuando la tienda lo activa. Se programaba y no se enviaba nunca.
- El correo «Subscription on hold to active» se envía cuando la tienda reactiva una suscripción en espera desde su pantalla de edición.
- El asunto por defecto de cinco correos (cancelada, caducada, en espera, pausada y reactivada) escribía mal «Subscription».
- Los enlaces de la administración a la pantalla de suscripciones vuelven a funcionar: el enlace de ajustes del plugin, el de la suscripción en las notas del pedido, la vuelta tras pausar, reactivar o cancelar, «Go Back» y la exportación CSV terminaban en «Lo siento, no tienes permisos para acceder a esta página».
- La papelera de la lista de suscripciones ofrece «Restaurar» y «Borrar permanentemente», para restaurar o borrar una suscripción concreta.
- La ruta REST
aswc-view-subscriptiondevuelve las suscripciones. Filtraba por una clave de metadatos sin su guion bajo y no devolvía ninguna. - Desaparece un error de JavaScript en las páginas de carrito y de pago clásicas: el script de los bloques se ejecutaba donde no hay bloques.
- WordPress 6.7 y posteriores ya no registran el aviso «translation loading was triggered too early» en cada petición. También desaparecen dos avisos de PHP en la tienda y en la pantalla de edición de producto.
- La plantilla de traducción (.pot) vuelve a cubrir todos los textos: unos 360 no se podían traducir, entre ellos el correo HTML de factura de renovación.
- Accesibilidad: todos los campos del panel de suscripción del producto (simple, multiproducto y por variación) tienen ahora un nombre que anuncia el lector de pantalla.
- Guardar una suscripción al principio de una petición de administración (por ejemplo, desde admin-ajax o admin-post) ya no termina con un error fatal.
- Desinstalar el plugin elimina también sus datos transitorios.
Seguridad:
- Redsys, Bizum y Google Pay solo aceptan el resultado de un pago cuando su firma es válida. Un retorno falsificado a la tienda podía marcar un pedido como pagado.
- Las notificaciones de pago de Inespay se autentican. Una notificación cuyo importe firmado no coincide con el pedido lo deja en espera, y una notificación repetida para un pedido ya pagado se ignora.
- Los enlaces de administración para pausar y reactivar una suscripción exigen permiso para editar pedidos, un enlace válido y el estado esperado. Una reactivación se podía disparar sin haber iniciado sesión.
- Las comprobaciones de licencia y de actualizaciones verifican siempre el certificado del servidor, y un paquete de actualización solo se acepta si viene del servidor de licencias por https.
- En Mi cuenta, los detalles de una suscripción, su lista de renovaciones y su cambio de método de pago (Stripe incluido) solo están disponibles para el cliente al que pertenece.
- Las acciones del cliente para pausar, reactivar y cancelar se deciden a partir del estado guardado de la suscripción y de los ajustes de la tienda, así que ya no se pueden saltar el plazo mínimo ni el límite de cancelaciones de prueba. Un enlace mostrado antes de actualizar falla una vez; al recargar la página aparece uno que funciona.
- La fecha de inicio que envía un cliente solo se acepta si es una de las que ofrece el producto.
- El bloque de Pago crea siempre la suscripción cuando el carrito la contiene; un parámetro de la petición podía saltársela.
- Un cambio de plan solo da crédito por prorrateo para una suscripción propia y activa del cliente, y cada crédito se gasta una sola vez. Un periodo reembolsado no genera crédito.
- Refuerzos de la auditoría de seguridad de la 3.0.0: las rutinas de actualización y la configuración del vault de PayPal solo se ejecutan para los administradores; la acción masiva de fecha de inicio personalizada comprueba el usuario y la petición; una acción de fin de periodo solo termina suscripciones que esperan terminar; el restaurador de la programación nunca reintenta retenciones decididas por la tienda, y las pasarelas Redsys incluidas ya no escriben la clave de firma en el log de depuración.
- La pestaña de descuentos del producto y los campos de descuento de cada variación solo se guardan para un usuario que puede editar ese producto (defensa en profundidad).
Desarrollo:
- Se elimina el selector «One-time purchase / Subscription» que se imprimía bajo el precio; lo sustituye el nuevo widget. La acción AJAX
aswc_onetime_purchasesigue registrada como obsoleta y no hace nada (se registra en el log como mucho una vez al día conWP_DEBUG). Consultadocs/reference/hooks-and-extension-points.md. - Se elimina
ASWC_Admin::aswc_admin_reactivate_onhold_subscription()y su hook deinit: era el manejador de un enlace que ninguna pantalla mostraba. - Nuevos filtros:
aswc_prepaid_term_end,aswc_send_manual_renewal_invoiceyaswc_variable_product_has_one_time_variation.
Compatibilidad:
- Probado hasta WordPress 7.1 y WooCommerce 11.1.0.
- Requiere WordPress 6.5 o superior, WooCommerce 8.0 o superior y PHP 7.4 o superior.
- Totalmente compatible con el almacenamiento de pedidos de alto rendimiento de WooCommerce (HPOS) y con los bloques de Carrito y Pago.
- Sigue funcionando de forma autónoma, sin depender de la extensión WooCommerce Subscriptions.







