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.

Dúvidas? Faça um comentário logo abaixo ou envie uma mensagem clicando aqui.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *