Woocommerce

Frete grátis no WooCommerce: esconder as outras opções de entrega

Quem paga SEDEX tendo frete grátis na mesma tela não fez isso de propósito: só não viu. Enquanto as duas opções ficarem lado a lado, vai continuar acontecendo. O filtro que resolve é o woocommerce_package_rates, num mu-plugin ou no functions.php do tema filho.

O filtro que apaga as outras taxas

add_filter( 'woocommerce_package_rates', function ( $rates, $package ) {
    $gratis = array();

    foreach ( $rates as $id => $rate ) {
        if ( 'free_shipping' === $rate->get_method_id() ) {
            $gratis[ $id ] = $rate;
        }
    }

    return $gratis ? $gratis : $rates;
}, 100, 2 );

O $rates chega com chaves do tipo free_shipping:3, onde o número é o ID da instância do método naquela zona. Por isso comparo pelo get_method_id() e não pela chave inteira: funciona em qualquer zona, sem hardcode. O return $rates no final evita deixar o carrinho sem opção nenhuma quando não há frete grátis. A prioridade 100 me põe depois dos plugins de correio, que registram as taxas na prioridade padrão.

Salvei e nada mudou no carrinho

É aqui que todo mundo acha que o código não pegou. O WooCommerce guarda o cálculo na sessão do visitante, numa chave feita do hash do pacote mais uma versão de transient. Enquanto essa versão não muda, ele devolve o valor velho sem chamar o seu filtro:

cd /var/www/rogertakemiya.com.br/html
sudo -u www-data wp eval 'WC_Cache_Helper::get_transient_version( "shipping", true );'

O segundo argumento em true gera uma versão nova e invalida todos os pacotes de frete em cache de uma vez. Depois teste em janela anônima, porque a sua sessão antiga também segura os valores. No painel o que chega perto é WooCommerce, Status, Ferramentas, Limpar sessões de clientes — mas essa ferramenta apaga os carrinhos de quem estiver na loja naquele momento.

Um cuidado antes de subir pra produção: retirada na loja usa o método local_pickup e vai sumir junto. Se a loja oferece retirada, aceite os dois no if, senão você troca um problema por uma reclamação no WhatsApp.

Post Recentes

Erro HTTP no WordPress ao enviar imagem para a biblioteca de mídia

A barra de upload chega no fim e o WordPress devolve só "Erro HTTP". Separe as três causas: Imagick barrado…

21 horas atrás

style amp-custom acima de 75KB: como cortar o CSS inline do AMP

The author stylesheet specified in tag 'style amp-custom' is too long? Meça o bloco com curl e tire da fila…

1 dia atrás

Creation of dynamic property: deprecated no PHP 8.3 com WordPress 6.9

debug.log crescendo em gigabytes com avisos de propriedade dinâmica. Veja como isolar o plugin culpado, corrigir a classe e silenciar…

2 dias atrás

Plugin do Magento 2 não executa: método final, private ou objeto novo

O before ou around declarado no di.xml nunca dispara. Confira o Interceptor em generated e descarte as três causas que…

2 dias atrás

Criar swapfile no Ubuntu: parar o OOM killer de matar o MySQL

VPS de 2 GB onde o mysqld morre de madrugada e o site volta com erro de conexão. Como confirmar…

4 dias atrás

Grupos nomeados no preg_match: pare de contar índice de $matches

Regex com cinco parênteses e ninguém lembra se a data é $matches[2] ou $matches[3]. Nomeie os grupos e leia o…

5 dias atrás