Woocommerce

Preço a partir de no WooCommerce: esconder o intervalo do produto variável

Produto variável no WooCommerce 9.x mostra na listagem algo como R$ 49,00 – R$ 129,00. O cliente bate o olho no número maior, acha caro e nem abre a página. Trocar isso por A partir de R$ 49,00 é um filtro só no functions.php do tema filho.

O filtro woocommerce_variable_price_html

add_filter( 'woocommerce_variable_price_html', 'rt_preco_a_partir_de', 10, 2 );

function rt_preco_a_partir_de( $price_html, $product ) {
    $min = $product->get_variation_price( 'min', true );
    $max = $product->get_variation_price( 'max', true );

    if ( $min === $max ) {
        return wc_price( $min ) . $product->get_price_suffix();
    }

    return sprintf( 'A partir de %s', wc_price( $min ) ) . $product->get_price_suffix();
}

Repare que eu não escrevo valor na mão. O get_variation_price( 'min', true ) devolve o menor preço já com o tratamento de imposto de exibição da loja, e o wc_price() aplica símbolo, separador e casas decimais que você configurou. O filtro recebe o preço já com o sufixo, então quem monta a string do zero precisa somar o get_price_suffix() de novo. E quando todas as variações custam o mesmo o intervalo nem existe: por isso o teste de igualdade.

Se o valor exibido estiver velho, é cache de preço

O filtro pega na hora. Quem atrasa são os preços: o mínimo e o máximo saem de um cache por produto, então mexer numa variação por importação ou direto no banco deixa a vitrine desatualizada.

# apaga TODOS os transientes do site, não só os do Woo
sudo -u www-data wp transient delete --all

# object cache persistente (Redis, Memcached) não sai no comando acima
sudo -u www-data wp cache flush

Dentro de um importador o cirúrgico é melhor: chame wc_delete_product_transients( $product_id ) depois de salvar cada produto. Se o intervalo insistir, olhe o cache de página do nginx e o plugin de cache antes de culpar o filtro.

Se travou nisso e precisa de ajuda, me chama aqui.

Post Recentes

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…

4 horas 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…

10 horas 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…

2 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…

3 dias atrás

Token de integração da API do Magento 2: gerar e usar no header Bearer

Erro The consumer isn't authorized to access resources ao chamar a REST do Magento 2.4.8? Ative a integração, libere os…

3 dias atrás

Rate limit no wp-login.php com nginx: barrar força bruta antes do PHP

Bots batendo centenas de POST por minuto no login derrubam a CPU. Configure limit_req_zone no nginx e devolva 429 antes…

4 dias atrás