
Woocommerce Brasil
Mexeu no preço ou no atributo de um produto variável e agora o cliente escolhe a combinação e leva um “Desculpe, este produto não está disponível. Escolha uma combinação diferente”. A variação está publicada, com preço e com estoque. Não é o produto: é dado velho guardado pelo WooCommerce.
Essa frase vem do template de variação indisponível, e o JS só mostra ela quando a combinação escolhida não está no data-product_variations do formulário — o JSON que o get_available_variations() montou na hora de renderizar a página.
Cada produto variável guarda a faixa de preços no transient wc_var_prices_ seguido do ID do produto (o hash de preço fica dentro, como chave do array). A ferramenta de transients sobe a versão do cache de produto e invalida esse monte de uma vez:
sudo -u www-data wp wc tool list
sudo -u www-data wp wc tool run clear_transients --user=1 É o mesmo botão de WooCommerce > Status > Ferramentas > Transientes do WooCommerce, só que pelo terminal. Os comandos wp wc passam pela REST, por isso exigem o --user de um administrador. O wp transient delete --all também resolve, mas leva junto o cache do site inteiro; em loja grande eu fico na ferramenta.
Se limpou tudo e o erro voltou, olhe a wp_wc_product_meta_lookup (troque o prefixo se o seu não for wp_). É ela que responde por preço mínimo, máximo e situação de estoque nas consultas da loja, e ela desencontra do postmeta quando uma importação grava direto no banco:
SELECT product_id, min_price, max_price, stock_status
FROM wp_wc_product_meta_lookup
WHERE product_id IN (SELECT ID FROM wp_posts WHERE post_parent = 1234); Preço nulo ou stock_status errado nessa consulta confirma o diagnóstico. Com backup do banco na mão, refaça as tabelas e rode as migrações pendentes do plugin:
sudo -u www-data wp wc update
sudo -u www-data wp wc tool run regenerate_product_lookup_tables --user=1 A regeneração roda em lotes pelo Action Scheduler, então dê alguns minutos em loja grande antes de testar. E confira o óbvio que eu já deixei passar: o atributo precisa estar marcado como “Usado para variações” na aba Atributos do produto pai. Sem isso o seletor nunca acha combinação, por mais transient que você apague.
Importou o banco de produção e o site pula para o domínio antigo? Rode o UPDATE em core_config_data, limpe o…
Seu catch trata pedido inexistente e banco fora do ar do mesmo jeito. Veja como criar exceção customizada em PHP…
O form do admin salva mas abre em branco na edição: veja o getData() indexado pelo id da entidade e…
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…
Escreva 31 de agosto de 2026 em PHP 8.3 sem aquele array com os doze meses, usando IntlDateFormatter com pattern…
Listagem de CPT com meta_query que demora segundos: veja o EXPLAIN da query do WP_Query e o índice composto em…