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.