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

register_post_meta com show_in_rest: campo personalizado no /wp-json

O meta está no banco mas some do /wp-json/wp/v2/posts. Veja o register_post_meta certo, com single, type, schema de array e…

6 horas atrás

IntlDateFormatter: data por extenso em pt-BR sem array de meses

Escreva 31 de agosto de 2026 em PHP 8.3 sem aquele array com os doze meses, usando IntlDateFormatter com pattern…

1 dia atrás

wp_postmeta lento: índice em meta_key e meta_value para meta_query

Listagem de CPT com meta_query que demora segundos: veja o EXPLAIN da query do WP_Query e o índice composto em…

3 dias atrás

WP-Cron travado: eventos agendados que não rodam no WordPress 6.9

Post com Perdeu o agendamento e backup que não roda há dias: inspecione a fila do WP-Cron, apague a trava…

3 dias atrás

Desligar o AMP no WordPress 6.9: redirect do /amp/ sem perder tráfego

Como aposentar o plugin AMP sem transformar centenas de URLs /amp/ indexadas em 404: o rewrite 301 no nginx, a…

4 dias atrás

Redis OOM Magento 2: ajustar a maxmemory-policy e separar os bancos

A loja cai com OOM command not allowed when used memory > maxmemory: ajuste a maxmemory-policy do Redis e separe…

4 dias atrás