O desenvolvimento desta versão custou 4.250 euros. O custo da primeira versão foi de 38.000 euros. O custo acumulado desde a primeira versão é de 46.610 euros, mas o custo para você é apenas a licença a partir de 80€.
Nova versão 3.0.x do plugin Assinaturas Avançadas para WooCommerce. É uma versão maior: apresenta as opções de compra na ficha do produto ("Compra única" ou "Assine e economize"), o desconto opcional Assine e economize com regras próprias, a tradução completa para o português e a possibilidade de o cliente alterar a quantidade e a frequência da sua assinatura a partir da Minha conta. Além disso, traz uma auditoria de segurança completa e uma longa lista de correções em renovações, alterações de plano, descontos e gateways de pagamento.
Versões da versão
3.0.0
Importante:
- Atualização recomendada para todas as lojas: inclui correções de segurança e de cobranças nos gateways incluídos, na Minha conta e nas renovações.
- O seletor "Compra única / Assinatura" que aparecia abaixo do preço desaparece e é substituído pelo novo widget de opções de compra. Se o seu tema ou algum trecho de código dependia dele, revise-o antes de atualizar.
- O módulo de data de início personalizada (Custom Start Date) fica desativado na 3.0.0 e sua seção de ajustes não é exibida, também nas lojas que o tinham ativado: mostrava a data escolhida, mas a assinatura começava e era cobrada no momento. Voltará, terminado, em uma versão posterior.
- Ao atualizar, os assinantes que estavam em "Pendente de cancelar" são cancelados na sua próxima data de pagamento, ou nas doze horas seguintes se essa data já tiver passado. Você receberá então seus e-mails de cancelamento.
- Ao atualizar, as assinaturas ativas com a data do próximo pagamento no passado e nada programado passam a ser cobradas na próxima data do seu ciclo. O período vencido não é cobrado e fica uma nota na assinatura.
- Novo:
Opções de compra na ficha do produto: "Compra única" ou "Assine e economize", como um grupo de opções nativo e gerenciável com o teclado, com a economia destacada em uma etiqueta. Funciona em produtos simples e variáveis (por variação) e em temas clássicos e de blocos. A opção pré-selecionada é escolhida nas configurações.
- Assine e economize (desativado por padrão; nada muda até que você ative): o preço da assinatura é o preço normal do produto menos uma porcentagem (de 1% a 50%), que pode vir de um ajuste do produto ou da variação, da primeira regra que coincida ou do ajuste global. Você também pode descontar o primeiro pedido e limitar o número de pedidos com desconto. Tudo é salvo na assinatura ao se inscrever, então mudar as configurações mais tarde nunca altera seu preço.
- Nova tela WooCommerce › Assine & Economize com regras ordenadas por condições (preço acima ou abaixo de um valor, categoria, etiqueta ou produtos específicos). Ganha a primeira regra que coincide. As regras podem ser movidas para cima, para baixo, arrastadas para reordená-las e excluídas em dois passos.
- O cliente pode escolher a frequência de entrega dentro dos períodos e limites que a loja permitir, a menos que o produto a tenha bloqueada.
- No carrinho clássico, cada linha que o admite pode ser trocada entre compra única e assinatura, com sua frequência. Os totais do carrinho e do pagamento (clássicos e de blocos) mostram uma linha com a economia de Assine e economize.
- Na Minha conta, o cliente pode alterar a quantidade e a frequência da sua assinatura. A alteração é aplicada a partir da próxima renovação, com uma pré-visualização do novo valor e da nova data.
- Cada linha de um produto que oferece as duas opções mostra "Compra: compra única" ou "Compra: assinatura", com suas condições, no carrinho, no pagamento (clássico e de blocos), no pedido, na Minha conta, na confirmação do pedido e nos e-mails. Uma assinatura de N unidades é criada e renovada por N unidades.
- Os tramos de desconto de renovação podem ser somados ao desconto de Assine e economize ou aplicados depois dele: primeiro Assine e economize enquanto durar e depois os tramos (é um ajuste). Uma mudança de plano pega os tramos do novo produto.
- Tradução para o português de Portugal (pt_PT) incluída: todo o plugin, com os gateways incluídos de Redsys, Bizum, Google Pay e Inespay. Uma loja em português já não exibe textos em inglês no pagamento, na Minha conta, nos e-mails nem nas configurações.
- Ao atualizar, as assinaturas que se renovam com um ciclo diferente do seu produto aparecem em um aviso de administração com o botão "Alinhar com o produto" para alinhá-las.
- Corrigido:
As traduções incluídas na pasta
- do plugin são carregadas de verdade. No WordPress 6.7 e posteriores, eram buscadas em uma pasta que não existe, então apenas eram aplicadas as instaladas em
languages/Uma assinatura cancelada pelo cliente na Minha conta, ou pela loja a partir da administração, agora termina de verdade. Se não tinha data de fim, ficava para sempre em "Pendente de cancelar": nunca era cancelada, o e-mail de assinatura cancelada não saía e uma loja que dá acesso de acordo com o estado da assinatura continuava a dar. Agora é cancelada quando termina o período já pago. Novo filtrowp-content/languages/plugins/. - Uma nova tentativa de pagamento cobra cada período no máximo uma vez. Com uma cobrança pendente, ou com uma que expirou depois que o banco a aprovou, a nova tentativa poderia criar e cobrar uma segunda renovação do mesmo período.
aswc_prepaid_term_end. - Quando uma nova tentativa paga uma renovação falhada com um pedido de renovação novo, o cliente já não pode pagar também o pedido falhado (no pagamento, na Minha conta ou com a ação de administração "Tentar pagamento de pedido pendente novamente"). Se já havia um pagamento em andamento quando a nova tentativa foi executada, é marcado em ambos os pedidos para que você decida o reembolso.
- Duas execuções de renovação simultâneas para a mesma assinatura (vários lotes do Action Scheduler, ou um executor do WP-CLI junto ao WP-Cron) já não podem cobrar a mesma.
- Stripe: uma renovação cuja resposta se perde (um tempo de espera esgotado, um servidor que para no meio da solicitação, um erro de um proxy) já não é marcada como falhada, o que a deixava pagável e permitia que uma nova tentativa cobrasse o período duas vezes. Agora fica em espera com uma nota no pedido, não é cobrada enquanto isso e é consultada no Stripe uma hora depois: é completada se a cobrança foi feita e passa para as novas tentativas normais se não.
- Stripe: enquanto uma renovação está retida à espera de confirmar sua cobrança, reativar a assinatura já não permite que a próxima execução crie e cobre outra renovação do mesmo período. A retenção também fica anotada na assinatura.
- Stripe: um aviso tardio de "pagamento falhado" já não faz falhar uma renovação que já está paga. Stripe e PayPal: uma renovação já não volta a colocar o cartão que o cliente havia substituído.
- PayPal: quando o PayPal não responde (tempo de espera esgotado, erro de conexão ou erro do servidor), a renovação fica retida para que você revise, em vez de ser marcada como falhada e reintentada, o que poderia cobrálas duas vezes.
- PayPal e WooPayments: uma renovação nunca fica pagável quando o plugin de pagamento falha com um erro interno após enviar a cobrança. As de PayPal ficam retidas para que você revise e as de WooPayments são conciliadas. Antes, uma nova tentativa poderia cobrálas pela segunda vez.
- Uma assinatura sem um ciclo de faturamento válido já não se renova todos os dias: pega o ciclo do seu produto ou fica em espera e nunca é cobrada. Também não é cobrada por uma nova tentativa de pagamento nem pelas ações manuais da loja (Criar Pedido de Renovação Pendente, Tentar Pagamento de Pedido Pendente Novamente e Tentar Pagamento de Renovação Novamente), que agora a rejeitam com uma nota.
- Ao atualizar para a 3.0.0, as assinaturas sem ciclo de faturamento pegam o do seu produto.
- O intervalo de faturamento de um produto de assinatura, e o de cada variação, já não vem pré-selecionado em "Dias": é necessário escolhê-lo, ou o produto não é salvo como assinatura.
- O "Pagamento" e o "Período de Faturamento" de uma assinatura existente são salvos a partir da sua caixa de programação, e um ciclo vazio já não é exibido como "Dias".
- As verificações do ciclo de faturamento aceitam períodos adicionados por outros plugins, nunca modificam uma assinatura só por exibi-la e enviam à loja no máximo um e-mail por dia sobre assinaturas sem ciclo.
- Uma assinatura com período de teste se renova no dia em que terminou o teste, não no dia em que foi comprada (a segunda cobrança chegava menos de um mês depois da primeira).
- 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).
- Uma nova subscrição é datada no momento real em que é criada. A sua data de criação era a hora local da loja guardada como UTC, então numa loja a leste do UTC aparecia mais tarde do que o real (duas horas em Espanha no verão) e as novas subscrições eram ordenadas abaixo de outras mais antigas. As subscrições criadas antes da 3.0.0 mantêm a sua data.
- Um pedido de renovação que o cliente paga é registado: uma renovação falhada paga na página de pagamento do pedido, ou uma renovação manual, agora move a data do próximo pagamento um intervalo e programa esse pagamento. Antes, a subscrição voltava a estar ativa sem nada programado e não se renovava nunca mais.
- Uma renovação sem nada a pagar (um cupão recorrente de 100%) é registada como qualquer outra: a subscrição continua ativa e a sua próxima renovação fica programada.
- A verificação diária da programação restaura a ação de pagamento que falta nas lojas com armazenamento de pedidos de alto desempenho (HPOS). Procurava as subscrições apenas entre as entradas e não encontrava nenhuma.
- Uma subscrição ou um pedido cancelado, reembolsado ou expirado após programar a sua data de início já não se ativa quando essa data chega.
- Uma subscrição eliminada, cancelada por um administrador ou reembolsada enquanto uma renovação falhada aguarda a sua nova tentativa já não mantém essa nova tentativa programada.
- Reativar uma subscrição pausada na Minha conta já não programa uma nova tentativa de pagamento.
- Um reembolso total do primeiro pedido de uma subscrição volta a cancelá-la. A loja tratava esse primeiro pedido como uma renovação, então um cliente reembolsado continuava subscrito e era cobrado na próxima renovação.
- Os tramos de desconto de renovação chegam a todas as renovações para as quais foram configurados: o contador de renovações pagas nunca avançava, então um tramo que começava na segunda renovação ou mais tarde nunca se aplicava. Agora cada renovação paga conta uma vez, e uma renovação reembolsada continua a contar.
- Editar os tramos de desconto de renovação de um produto já não altera o preço das subscrições existentes. Os tramos são guardados ao iniciar a subscrição e mantêm-se tal como foram vendidos, também os dos cupões.
- Os tramos de desconto de renovação configurados num cupão, e os tramos por papel de cliente, agora aplicam-se às renovações. Eram guardados, mas nunca usados. Os de um cupão também se aplicam a um produto sem tramos próprios, mesmo que "Override Product Discounts" esteja desmarcado.
- O pagamento já não termina com um erro fatal quando o produto tem tramos de desconto de renovação.
- O desconto do primeiro pagamento aplica-se uma única vez e apenas no primeiro pagamento. Aplicava-se duas vezes e arrastava-se para todas as renovações. Não se aplica a um período de teste nem a uma mudança de plano.
- Um produto com desconto no primeiro pagamento mostra no pagamento o seu preço real de renovação. Os dois checkouts mostravam o primeiro pagamento com desconto como preço de todas as renovações, embora as renovações fossem cobradas ao preço completo.
- Um produto com período de teste comprado com um cupão recorrente renova ao seu preço com desconto. Era guardado com um montante de renovação de 0 e renovava-se gratuitamente.
- A taxa de adesão é cobrada uma vez por subscrição, seja qual for a quantidade. Uma subscrição comprada com quantidade 3 pagava a taxa três vezes.
- Com os preços introduzidos com impostos incluídos, o total recorrente da subscrição é guardado arredondado aos decimais da loja.
- Mudanças de plano: a mudança é cobrada na data do próximo pagamento que mostra a subscrição, e a nova data é contada a partir da mudança (antes uma melhoria concedia um período inteiro). Uma mudança nunca concede o período de teste do novo produto; o crédito do período não utilizado é o que realmente se pagou por ele; é rejeitada uma segunda linha de mudança para a mesma subscrição e um pedido de mudança confirmado duas vezes ao mesmo tempo aplica-se uma única vez.
- Mudanças de plano com prorrateamento: o crédito da subscrição anterior aplica-se uma vez por linha, não uma vez por unidade.
- Uma mudança de plano para uma variação que toma o período de faturamento do produto variável é reconhecida como o que é. Antes era sempre tratada como uma descida de plano, fossem quais fossem os preços.
- Uma descida de plano para uma variação que herda o intervalo do seu produto pai recebe o seu crédito. Era calculada como infinita e nunca se aplicava.
- Uma mudança de plano mantém a faturação de uma subscrição sem data de fim quando o seu crédito é adicionado como dias, começa o novo período no dia da mudança e conserva os tramos de desconto de um cupão de adesão.
- "Stop Downgrade" e "Allow switching only to the same interval" estão desativados a menos que os marques. Uma vez guardadas as configurações, eram lidas como ativadas e eram rejeitadas todas as descidas de plano e todas as mudanças entre intervalos.
- Dia de renovação sincronizado: a primeira renovação mensal é o dia deste mês se ainda não passou; todas as renovações mantêm-se nesse dia; a ficha de produto anuncia a data que é cobrada; "Último dia do mês" renova o último dia de cada mês, e um site a leste de UTC já não adianta um dia a primeira renovação no final do seu dia.
- "Let the customer choose the expiry" numa subscrição variável: o campo de caducidade oferece o período de faturamento do produto (antes caía em "Dias") e rejeita uma caducidade mais curta que o intervalo de faturamento. O mesmo se aplica a uma subscrição criada a partir de uma venda adicional de CartFlows.
- O limite de cancelamentos de períodos de teste de um produto aplica-se: após o número indicado de testes cancelados, o cliente já não pode cancelar o seguinte.
- O bloco de Pagamento mostra no resumo do pedido o período de faturamento ("/ 1 mês"), como já fazia o bloco de Carrinho.
- Os números de renovação do bloco de Pagamento seguem o carrinho: após um cupão ou uma mudança de quantidade ou de envio já não ficam com os montantes anteriores até recarregar a página.
- Bloco de Pagamento: o primeiro pagamento de um teste gratuito (a taxa de adesão, ou nada) já não aparece como uma oferta. A linha mostra o que é cobrado agora, o teste e o preço de renovação.
- Um produto variável que mistura variações de subscrição e de compra única já não mostra a sua gama de preços com um período de faturamento, o que apresentava o preço de compra única como mensal. Nova função auxiliar e filtro.
aswc_variable_product_has_one_time_variation(). - O ícone de cartão da Redsys (e os ícones por defeito das outras passarelas incluídas) já não ocupa toda a caixa de pagamento no checkout clássico com um tema de blocos. O seu próprio logótipo não é tocado.
- Passarela Redsys incluída: uma renovação cobrada com o cartão guardado já não o guarda novamente. Cada renovação adicionava outro cartão idêntico à conta do cliente. Ao atualizar, são eliminados os duplicados que guardaram as versões anteriores, conservando o que usam as renovações.
- Redsys: uma renovação cobra o cartão guardado mais recente do cliente, não o mais antigo, e um cartão já guardado nunca é guardado novamente em clientes com mais de dez cartões.
- Uma cancelamento na Redsys, Bizum ou Google Pay cancela o pedido na loja. Antes ficava pendente.
- Os pagamentos com contra reembolso, transferência ou cheque, e as subscrições manuais, enviam ao cliente a fatura de renovação com o link para pagá-la. Antes o cliente não sabia nada até que a loja usava "Retry Renewal Payment". Novo filtro.
aswc_send_manual_renewal_invoice. - "Retry Renewal Payment" volta a ser oferecido num pedido de renovação pendente, e o e-mail que a loja recebe sobre uma renovação falhada indica que é uma renovação e nomeia a sua subscrição.
- A loja recebe uma única vez o e-mail de uma renovação falhada. O plugin enviava a sua própria cópia juntamente com a de WooCommerce.
- O e-mail de lembrete de renovação é enviado antes da renovação quando a loja o ativa. Era programado e nunca era enviado.
- O e-mail "Subscription on hold to active" é enviado quando a loja reativa uma subscrição em espera a partir da sua tela de edição.
- O assunto por defeito de cinco e-mails (cancelada, expirada, em espera, pausada e reativada) escrevia mal "Subscription".
- Os links da administração para a tela de subscrições voltam a funcionar: o link de configurações do plugin, o da subscrição nas notas do pedido, o retorno após pausar, reativar ou cancelar, "Go Back" e a exportação CSV terminavam em "Desculpe, não tem permissões para aceder a esta página".
- A lixeira da lista de subscrições oferece "Restaurar" e "Eliminar permanentemente", para restaurar ou eliminar uma subscrição concreta.
- A rota REST
aswc-view-subscriptiondevolve as subscrições. Filtrava por uma chave de metadados sem o seu sublinhado e não devolvia nenhuma. - Desaparece um erro de JavaScript nas páginas de carrinho e de pagamento clássicas: o script dos blocos era executado onde não há blocos.
- WordPress 6.7 e posteriores já não registam o aviso "translation loading was triggered too early" em cada pedido. Também desaparecem dois avisos de PHP na loja e na tela de edição de produto.
- O modelo de tradução (.pot) volta a cobrir todos os textos: cerca de 360 não podiam ser traduzidos, entre eles o e-mail HTML de fatura de renovação.
- Acessibilidade: todos os campos do painel de subscrição do produto (simples, multiproduto e por variação) têm agora um nome que anuncia o leitor de ecrã.
- Guardar uma subscrição no início de um pedido de administração (por exemplo, a partir de admin-ajax ou admin-post) já não termina com um erro fatal.
- Desinstalar o plugin elimina também os seus dados transitórios.
Segurança:
- Redsys, Bizum e Google Pay apenas aceitam o resultado de um pagamento quando a sua assinatura é válida. Um retorno falsificado à loja podia marcar um pedido como pago.
- As notificações de pagamento do Inespay são autenticadas. Uma notificação cujo valor assinado não coincide com o pedido fica em espera, e uma notificação repetida para um pedido já pago é ignorada.
- Os links de administração para pausar e reativar uma subscrição exigem permissão para editar pedidos, um link válido e o estado esperado. Uma reativação podia ser disparada sem ter iniciado sessão.
- As verificações de licença e de atualizações sempre verificam o certificado do servidor, e um pacote de atualização só é aceito se vier do servidor de licenças por https.
- Na Minha conta, os detalhes de uma subscrição, a sua lista de renovações e a sua alteração de método de pagamento (incluindo Stripe) estão disponíveis apenas para o cliente a que pertencem.
- As ações do cliente para pausar, reativar e cancelar são decididas com base no estado guardado da subscrição e nas definições da loja, portanto, já não é possível ignorar o prazo mínimo nem o limite de cancelamentos de teste. Um link mostrado antes de atualizar falha uma vez; ao recarregar a página, aparece um que funciona.
- A data de início que um cliente envia só é aceita se for uma das que o produto oferece.
- O bloco de Pagamento cria sempre a subscrição quando o carrinho a contém; um parâmetro da solicitação podia ignorá-la.
- Uma alteração de plano só dá crédito por prorrateio para uma subscrição própria e ativa do cliente, e cada crédito é gasto uma única vez. Um período reembolsado não gera crédito.
- Reforços da auditoria de segurança da 3.0.0: as rotinas de atualização e a configuração do vault do PayPal só são executadas para os administradores; a ação em massa de data de início personalizada verifica o usuário e a solicitação; uma ação de fim de período só termina subscrições que esperam terminar; o restaurador da programação nunca reintenta retenções decididas pela loja, e as gateways Redsys incluídas já não escrevem a chave de assinatura no log de depuração.
- A aba de descontos do produto e os campos de desconto de cada variação só são guardados para um usuário que pode editar esse produto (defesa em profundidade).
Desenvolvimento:
- O seletor "Compra única / Subscrição" que era impresso sob o preço foi removido; é substituído pelo novo widget. A ação AJAX
aswc_onetime_purchasecontinua registrada como obsoleta e não faz nada (é registrada no log no máximo uma vez por dia comWP_DEBUG). Consultedocs/reference/hooks-and-extension-points.md. - Foi removido
ASWC_Admin::aswc_admin_reactivate_onhold_subscription()e seu hook deinit: era o manipulador de um link que nenhuma tela mostrava. - Novos filtros:
aswc_prepaid_term_end,aswc_send_manual_renewal_invoiceeaswc_variable_product_has_one_time_variation.
Compatibilidade:
- Testado até WordPress 7.1 e WooCommerce 11.1.0.
- Requer WordPress 6.5 ou superior, WooCommerce 8.0 ou superior e PHP 7.4 ou superior.
- Totalmente compatível com o armazenamento de pedidos de alto desempenho do WooCommerce (HPOS) e com os blocos de Carrinho e Pagamento.
- Continua a funcionar de forma autónoma, sem depender da extensão WooCommerce Subscriptions.







