O desenvolvemento desta versión custou 4.250 euros. O custo da primeira versión foi de 38.000 euros. O custo acumulado desde a primeira versión é de 46.610 euros, pero o custo para ti é só a licencia desde 80€.
Nova rama 3.0.x do plugin Subscripcions Avanzadas para WooCommerce. É unha versión maior: estrena as opcións de compra na ficha de produto («Compra única» ou «Suscríbete e aforra»), o desconto opcional Suscríbete e aforra con regras propias, a tradución completa ao galego e a posibilidade de que o cliente cambie a cantidade e a frecuencia da súa subscrición desde A miña conta. Ademais, trae unha auditoría de seguridade completa e unha longa lista de correccións en renovacións, cambios de plan, descontos e pasarelas de pago.
Versiones da rama
3.0.0
Importante:
- Actualización recomendada para todas as tendas: inclúe correccións de seguridade e de cobros nas pasarelas incluídas, en A miña conta e nas renovacións.
- O selector «Compra única / Subscripción» que aparecía baixo o prezo desaparece e o substitúe o novo widget de opcións de compra. Se o teu tema ou algún fragmento de código dependía del, revísao antes de actualizar.
- O módulo de data de inicio personalizada (Custom Start Date) queda desactivado na 3.0.0 e a súa sección de axustes non se mostra, tamén nas tendas que o tiñan activado: mostraba a data elixida, pero a subscrición comezaba e cobraba no momento. Volverá, terminado, nunha versión posterior.
- Ao actualizar, as subscricións que se quedaran en «Pendiente de cancelar» cancelaranse na súa seguinte data de pago, ou nas doce horas seguintes se esa data xa pasou. Recibirás entón os seus correos de cancelación.
- Ao actualizar, as subscricións activas coa data do seguinte pago no pasado e nada programado pasan a cobrarse na seguinte data do seu ciclo. O período vencido non se cobra e queda unha nota na subscrición.
- Novo:
Opcións de compra na ficha de produto: «Compra única» ou «Suscríbete e aforra», como un grupo de opcións nativo e manexable co teclado, co aforro destacado nunha etiqueta. Funciona en produtos simples e variables (por variación) e en temas clásicos e de bloques. A opción preseleccionada elíxese nos axustes.
- Suscríbete e aforra (desactivado por defecto; nada cambia ata que o actives): o prezo da subscrición é o prezo normal do produto menos un porcentaxe (do 1 % ao 50 %), que pode vir dun axuste do produto ou da variación, da primeira regra que coincida ou do axuste global. Podes descontar tamén o primeiro pedido e limitar o número de pedidos con desconto. Todo gárdase na subscrición ao darse de alta, así que cambiar os axustes máis adiante nunca cambia o seu prezo.
- Nova pantalla WooCommerce › Subscrebe e aforra con regras ordenadas por condicións (prezo por encima ou por debaixo dun importe, categoría, etiqueta ou produtos concretos). Gaña a primeira regra que coincide. As regras pódense subir, baixar, arrastrar para reordenalas e borrar en dous pasos.
- O cliente pode elixir a frecuencia de entrega dentro dos períodos e límites que permita a tenda, salvo que o produto a teña bloqueada.
- No carro clásico, cada liña que o admite pódese cambiar entre compra única e subscrición, coa súa frecuencia. Os totais do carro e do pago (clásicos e de bloques) mostran unha fila co aforro de Suscríbete e aforra.
- En A miña conta, o cliente pode cambiar a cantidade e a frecuencia da súa subscrición. O cambio aplícase desde a seguinte renovación, cunha vista previa do novo importe e da nova data.
- Cada liña dun produto que ofrece as dúas opcións mostra «Compra: compra única» ou «Compra: subscrición», coas súas condicións, no carro, o pago (clásico e de bloques), o pedido, A miña conta, a confirmación do pedido e os correos. Unha subscrición de N unidades créase e renóvase por N unidades.
- Os tramos de desconto de renovación pódense sumar ao desconto de Suscríbete e aforra ou aplicarse despois del: primeiro Suscríbete e aforra mentres dure e logo os tramos (é un axuste). Un cambio de plan toma os tramos do produto novo.
- Tradución ao galego de España (gl_ES) incluída: todo o plugin, coas pasarelas incluídas de Redsys, Bizum, Google Pay e Inespay. Unha tenda en galego xa non mostra textos en inglés no pago, en A miña conta, nos correos nin nos axustes.
- Ao actualizar, as subscricións que se renovan cun ciclo distinto ao do seu produto aparecen nun aviso de administración co botón «Alinhar co produto» para alinealas.
- Arreglado:
As traducións incluídas na carpeta
- do plugin cargan de verdade. En WordPress 6.7 e posteriores buscábanse nunha carpeta que non existe, así que só se aplicaban as instaladas en
languages/Unha subscrición cancelada polo cliente en A miña conta, ou pola tenda desde a administración, agora termina de verdade. Se non tiña data de fin quedábase para sempre en «Pendiente de cancelar»: nunca se cancelaba, o correo de subscrición cancelada non saía e unha tenda que dá acceso segundo o estado da subscrición seguía dándoo. Agora cancélase cando termina o período xa pagado. Novo filtrowp-content/languages/plugins/. - Un reintento de pago cobra cada período como moito unha vez. Con un cobro pendente, ou cun que expirou despois de que o banco o aprobara, o reintento podía crear e cobrar unha segunda renovación do mesmo período.
aswc_prepaid_term_end. - Cando un reintento paga unha renovación fallida cun pedido de renovación novo, o cliente xa non pode pagar tamén o pedido fallido (no pago, en A miña conta ou coa acción de administración «Retry pending order payment»). Se xa había un pago en marcha cando se executou o reintento, márcase nos dous pedidos para que decidas o reembolso.
- Dúas execucións de renovación simultáneas para a mesma subscrición (varios lotes de Action Scheduler, ou un executor de WP-CLI xunto a WP-Cron) xa non poden cobrala as dúas.
- Stripe: unha renovación cuxa resposta se perde (un tempo de espera esgotado, un servidor que se detén a metade da petición, un erro dun proxy) xa non se marca como fallida, o que a deixaba pagable e permitía que un reintento cobrara o período dúas veces. Agora queda en espera cunha nota no pedido, non se volve a cobrar mentres tanto e consúltase en Stripe unha hora despois: complétase se o cobro se fixo e pasa aos reintentos normais se non.
- Stripe: mentres unha renovación está retida á espera de confirmar o seu cobro, reactivar a subscrición xa non permite que a seguinte execución cree e cobre outra renovación do mesmo período. A retención tamén queda anotada na subscrición.
- Stripe: un aviso tardío de «pago fallido» xa non fai fallar unha renovación que xa está pagada. Stripe e PayPal: unha renovación xa non volve a poñer a tarxeta que o cliente había substituído.
- PayPal: cando PayPal non responde (tempo de espera esgotado, erro de conexión ou erro do servidor), a renovación queda retida para que a revises, en lugar de marcarse como fallida e reintentarse, o que podía cobrala dúas veces.
- PayPal e WooPayments: unha renovación nunca se queda pagable cando o plugin de pago falla cun erro interno despois de enviar o cobro. As de PayPal quedan retidas para que as revises e as de WooPayments concílianse. Antes, un reintento podía cobrarlas por segunda vez.
- Unha subscrición sen un ciclo de facturación válido xa non se renova cada día: toma o ciclo do seu produto ou se pon en espera e nunca se cobra. Tampouco a cobra un reintento de pago nin as accións manuais da tenda (Create Pending Renewal Order, Retry Pending Order Payment e Retry Renewal Payment), que agora a rexeitan cunha nota.
- Ao actualizar á 3.0.0, as subscricións sen ciclo de facturación toman o do seu produto.
- O intervalo de facturación dun produto de subscrición, e o de cada variación, xa non vén preseleccionado en «Días»: hai que elixilo, ou o produto non se garda como subscrición.
- O «Payment» e o «Billing Period» dunha subscrición existente gárdanse desde a súa caixa de programación, e un ciclo vacío xa non se mostra como «Días».
- As comprobacións do ciclo de facturación aceptan períodos engadidos por outros plugins, nunca modifican unha subscrición só por mostrala e envían á tenda como moito un correo ao día sobre subscricións sen ciclo.
- Unha subscrición cun período de proba renóvase o día en que terminou a proba, non o día en que se comprou (o segundo cobro chegaba menos dun mes despois do primeiro).
- 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).
- Unha subscrición nova queda datada no momento real no que se crea. A súa data de creación era a hora local da tenda gardada como UTC, así que nunha tenda ao leste de UTC aparecía máis tarde do que era (duas horas en España no verán) e as subscricións novas ordenábanse por debaixo doutras máis antigas. As subscricións creadas antes da 3.0.0 conservan a súa data.
- Un pedido de renovación que paga o cliente queda rexistrado: unha renovación fallida pagada na páxina de pago do pedido, ou unha renovación manual, move agora a data do seguinte pago un intervalo e programa ese pago. Antes a subscrición volvía a estar activa sen nada programado e non se renovaba nunca máis.
- Unha renovación sen nada que pagar (un cupón recorrente do 100 %) rexístrase como calquera outra: a subscrición segue activa e a súa seguinte renovación queda programada.
- A comprobación diaria da programación restaura a acción de pago que falte nas tendas con almacenamento de pedidos de alto rendemento (HPOS). Buscaba as subscricións só entre as entradas e non atopaba ningunha.
- Unha subscrición ou un pedido cancelado, reembolsado ou caducado despois de programar a súa data de inicio xa non se activa cando chega esa data.
- Unha subscrición eliminada, cancelada por un administrador ou reembolsada mentres unha renovación fallida espera o seu reintento xa non mantén ese reintento programado.
- Reactivar unha subscrición pausada en Mi conta xa non programa un reintento de pago.
- Un reembolso total do primeiro pedido dunha subscrición volve a cancelala. A tenda trataba ese primeiro pedido como unha renovación, así que un cliente reembolsado seguía subscrito e cobrárase na seguinte renovación.
- Os tramos de desconto de renovación chegan a todas as renovacións para as que se configuraron: o contador de renovacións pagadas non avanzaba nunca, así que un tramo que comezaba na segunda renovación ou máis tarde non se aplicaba nunca. Agora cada renovación pagada conta unha vez, e unha renovación reembolsada segue contando.
- Editar os tramos de desconto de renovación dun produto xa non cambia o prezo das subscricións existentes. Os tramos gárdanse ao comezar a subscrición e mantéñense tal como se venderon, tamén os dos cupons.
- Os tramos de desconto de renovación configurados nun cupón, e os tramos por rol de cliente, aplícanse agora ás renovacións. Gardáronse, pero nunca se usaron. Os dun cupón tamén se aplican nun produto sen tramos propios, aínda que «Override Product Discounts» estea desmarcado.
- O pago xa non termina cun erro fatal cando o produto ten tramos de desconto de renovación.
- O desconto do primeiro pago aplícase unha soa vez e só no primeiro pago. Aplícase dúas veces e arrástrase a todas as renovacións. Non se aplica a un período de proba nin a un cambio de plan.
- Un produto con desconto no primeiro pago mostra no pago o seu prezo real de renovación. Os dous checkouts mostraban o primeiro pago con desconto como prezo de todas as renovacións, aínda que as renovacións cobraban ao prezo completo.
- Un produto con período de proba comprado cun cupón recorrente renóvase ao seu prezo con desconto. Gardábase cun importe de renovación de 0 e renovábase gratis.
- A cuota de alta cámbiase unha vez por subscrición, sexa cal sexa a cantidade. Unha subscrición comprada con cantidade 3 pagaba a cuota tres veces.
- Con os prezos introducidos con impostos incluídos, o total recorrente da subscrición gárdase redondeado aos decimais da tenda.
- Cambios de plan: o cambio cámbiase na data do seguinte pago que mostra a subscrición, e a nova data contase desde o cambio (antes unha mellora regalaba un período enteiro). Un cambio nunca concede o período de proba do produto novo; o crédito do período non usado é o que realmente se pagou por el; rexeítase unha segunda liña de cambio para a mesma subscrición e un pedido de cambio confirmado dúas veces á vez aplícase unha soa vez.
- Cambios de plan con prorrateo: o crédito da subscrición anterior aplícase unha vez por liña, non unha vez por unidade.
- Un cambio de plan a unha variación que toma o período de facturación do produto variable recoñécese como o que é. Antes tratábase sempre como unha baixada de plan, foran cales foran os prezos.
- Unha baixada de plan a unha variación que herda o intervalo do seu produto pai recibe o seu crédito. Cálculase como infinito e nunca se aplicaba.
- Un cambio de plan mantén a facturación dunha subscrición sen data de fin cando o seu crédito se engade como días, comeza o novo período o día do cambio e conserva os tramos de desconto dun cupón de alta.
- «Stop Downgrade» e «Allow switching only to the same interval» están desactivados agás que os marques. Unha vez gardados os axustes, léense como activados e se rexeitan todas as baixadas de plan e todos os cambios entre intervalos.
- Día de renovación sincronizado: a primeira renovación mensual é o día deste mes se aínda non pasou; todas as renovacións mantéñense nese día; a ficha de produto anuncia a data que se cobra; «Último día do mes» renova o último día de cada mes, e un sitio ao leste de UTC xa non adianta un día a primeira renovación ao final da súa xornada.
- «Let the customer choose the expiry» nunha subscrición variable: o campo de caducidade ofrece o período de facturación do produto (antes caía en «Días») e se rexeita unha caducidade máis curta que o intervalo de facturación. O mesmo aplícase a unha subscrición creada desde unha venda adicional de CartFlows.
- O límite de cancelacións de períodos de proba dun produto aplícase: tras o número indicado de probas canceladas, o cliente xa non pode cancelar a seguinte.
- O bloque de Pago mostra no resumo do pedido o período de facturación («/ 1 mes»), como xa facía o bloque de Carrito.
- As cifras de renovación do bloque de Pago seguen ao carrito: tras un cupón ou un cambio de cantidade ou de envío xa non se quedan cos importes anteriores ata recargar a páxina.
- Bloque de Pago: o primeiro cobro dunha proba gratuita (a cuota de alta, ou nada) xa non aparece como unha oferta. A liña mostra o que se cobra agora, a proba e o prezo de renovación.
- Un produto variable que mestura variacións de subscrición e de compra única xa non mostra o seu rango de prezos cun período de facturación, o que presentaba o prezo de compra única como mensual. Nova función auxiliar e filtro
aswc_variable_product_has_one_time_variation(). - O icono de tarxeta de Redsys (e os iconos por defecto das demais pasarelas incluídas) xa non ocupa toda a caixa de pago no checkout clásico cun tema de bloques. O teu propio logotipo non se toca.
- Pasarela Redsys incluída: unha renovación cobrada coa tarxeta gardada xa non a garda outra vez. Cada renovación engadía outra tarxeta idéntica á conta do cliente. Ao actualizar elimínanse os duplicados que gardaron as versións anteriores, conservando a que usan as renovacións.
- Redsys: unha renovación cobra a tarxeta gardada máis recente do cliente, non a máis antiga, e unha tarxeta xa gardada nunca se volve a gardar en clientes con máis de dez tarxetas.
- Unha cancelación en Redsys, Bizum ou Google Pay cancela o pedido na tenda. Antes quedaba pendente.
- Os pagos con contra reembolso, transferencia ou cheque, e as subscricións manuais, envían ao cliente a factura de renovación co enlace para pagala. Antes o cliente non sabía nada ata que a tenda usaba «Retry Renewal Payment». Novo filtro
aswc_send_manual_renewal_invoice. - «Retry Renewal Payment» volve a ofrecerse nun pedido de renovación pendente, e o correo que recibe a tenda sobre unha renovación fallida indica que é unha renovación e nomea a súa subscrición.
- A tenda recibe unha soa vez o correo dunha renovación fallida. O plugin enviaba a súa propia copia xunto á de WooCommerce.
- O correo de recordatorio de renovación envíase antes da renovación cando a tenda o activa. Programábase e non se enviaba nunca.
- O correo «Subscription on hold to active» envíase cando a tenda reactivou unha subscrición en espera desde a súa pantalla de edición.
- O asunto por defecto de cinco correos (cancelada, caducada, en espera, pausada e reactivada) escribía mal «Subscription».
- Os enlaces da administración á pantalla de subscricións volven a funcionar: o enlace de axustes do plugin, o da subscrición nas notas do pedido, a volta tras pausar, reactivar ou cancelar, «Go Back» e a exportación CSV terminaban en «Desculpa, non tes permisos para acceder a esta páxina».
- A papelera da lista de subscricións ofrece «Restaurar» e «Borrar permanentemente», para restaurar ou borrar unha subscrición concreta.
- A ruta REST
aswc-view-subscriptiondevolve as subscricións. Filtraba por unha clave de metadatos sen o seu guion baixo e non devolvía ningunha. - Desaparece un erro de JavaScript nas páxinas de carrito e de pago clásicas: o script dos bloques executábase onde non hai bloques.
- WordPress 6.7 e posteriores xa non rexistran o aviso «translation loading was triggered too early» en cada petición. Tamén desaparecen dous avisos de PHP na tenda e na pantalla de edición de produto.
- A plantilla de tradución (.pot) volve a cubrir todos os textos: uns 360 non se podían traducir, entre eles o correo HTML de factura de renovación.
- Accesibilidade: todos os campos do panel de subscrición do produto (simple, multiproducto e por variación) teñen agora un nome que anuncia o lector de pantalla.
- Gardar unha subscrición ao principio dunha petición de administración (por exemplo, desde admin-ajax ou admin-post) xa non termina cun erro fatal.
- Desinstalar o plugin elimina tamén os seus datos transitorios.
Seguridade:
- Redsys, Bizum e Google Pay só aceptan o resultado dun pago cando a súa sinatura é válida. Un retorno falsificado á tenda podía marcar un pedido como pagado.
- As notificacións de pago de Inespay autentícanse. Unha notificación cuxo importe asinada non coincide co pedido déixao en espera, e unha notificación repetida para un pedido xa pagado ignórase.
- Os enlaces de administración para pausar e reactivar unha subscrición esixen permiso para editar pedidos, un enlace válido e o estado esperado. Unha reactivación podía dispararse sen ter iniciado sesión.
- As comprobacións de licenza e de actualizacións verifican sempre o certificado do servidor, e un paquete de actualización só se acepta se vén do servidor de licenzas por https.
- Na Mi conta, os detalles dunha subscrición, a súa lista de renovacións e o seu cambio de método de pago (Stripe incluído) só están dispoñibles para o cliente ao que pertence.
- As accións do cliente para pausar, reactivar e cancelar decídense a partir do estado gardado da subscrición e dos axustes da tenda, así que xa non se poden saltar o prazo mínimo nin o límite de cancelacións de proba. Un enlace mostrado antes de actualizar falla unha vez; ao recargar a páxina aparece un que funciona.
- A data de inicio que envía un cliente só se acepta se é unha das que ofrece o produto.
- O bloque de Pago crea sempre a subscrición cando o carro a contén; un parámetro da petición podía saltársela.
- Un cambio de plan só dá crédito por prorrateo para unha subscrición propia e activa do cliente, e cada crédito gástase unha soa vez. Un período reembolsado non xera crédito.
- Refuerzos da auditoría de seguridade da 3.0.0: as rutinas de actualización e a configuración do vault de PayPal só se executan para os administradores; a acción masiva de data de inicio personalizada comproba o usuario e a petición; unha acción de fin de período só termina subscricións que esperan terminar; o restaurador da programación nunca reintenta retencións decididas pola tenda, e as pasarelas Redsys incluídas xa non escriben a clave de sinatura no log de depuración.
- A pestana de descontos do produto e os campos de desconto de cada variación só se gardan para un usuario que pode editar ese produto (defensa en profundidade).
Desenvolvemento:
- Elimínase o selector «One-time purchase / Subscription» que se imprimía baixo o prezo; o novo widget substitúeo. A acción AJAX
aswc_onetime_purchasesegue rexistrada como obsoleta e non fai nada (regístrase no log como moito unha vez ao día conWP_DEBUG). Consultadocs/reference/hooks-and-extension-points.md. - Elimínase
ASWC_Admin::aswc_admin_reactivate_onhold_subscription()e o seu hook deinit: era o manexador dun enlace que ningunha pantalla mostraba. - Novos filtros:
aswc_prepaid_term_end,aswc_send_manual_renewal_invoiceeaswc_variable_product_has_one_time_variation.
Compatibilidade:
- Probado ata WordPress 7.1 e WooCommerce 11.1.0.
- Require WordPress 6.5 ou superior, WooCommerce 8.0 ou superior e PHP 7.4 ou superior.
- Totalmente compatible co almacenamento de pedidos de alto rendemento de WooCommerce (HPOS) e cos bloques de Carrito e Pago.
- Segue funcionando de forma autónoma, sen depender da extensión WooCommerce Subscriptions.







