# Como corrigir checkout do WooCommerce que não funciona

O checkout do WooCommerce não funcionar significa que o cliente chega à página de finalizar compra mas não consegue concluir: o botão de finalizar pedido não responde, a página recarrega sem avançar ou retorna erro. Quase sempre vem de conflito de plugin/tema, de requisições AJAX bloqueadas ou da página de checkout configurada errada.

## O que é o checkout do WooCommerce que não funciona?

O checkout do WooCommerce é a página onde o cliente informa dados de entrega e pagamento e finaliza o pedido. Quando ele 'não funciona', o fluxo de compra trava nesse ponto: o botão 'Finalizar compra' não dispara, os campos não validam, ou a página não carrega o formulário. É o erro mais caro de uma loja, porque acontece exatamente no momento da conversão e derruba o faturamento.

## Como identificar

- O botão 'Finalizar compra' / 'Place order' não responde ao clique e a página apenas recarrega.
- A página de checkout abre em branco ou sem o formulário de cobrança e entrega.
- Mensagem genérica no topo do formulário sem dizer o campo, ou o console do navegador mostra erro 'admin-ajax.php 403/500'.
- O carrinho está cheio, mas o checkout diz 'Seu carrinho está vazio' ou redireciona de volta ao carrinho.

**Antes de começar:** Faça backup e teste em ambiente de staging antes de atualizar WooCommerce ou trocar o tema em uma loja no ar. Nunca desative o nonce do checkout para 'resolver' AJAX: isso abre brecha de CSRF.

## Como prevenir

- Mantenha carrinho, checkout e minha conta sempre fora do cache e da minificação de JS
- Atualize WooCommerce, tema e gateways em staging antes de aplicar na loja ao vivo
- Monitore o console do navegador e os logs (WooCommerce > Status > Logs) para pegar erros de AJAX cedo

Erros relacionados

- [Como corrigir Add to cart que não funciona no WooCommerce](https://full.services/wp-fixer/corrigir-add-to-cart-woocommerce/)
- [Como corrigir pagamento do WooCommerce com erro](https://full.services/wp-fixer/corrigir-pagamento-erro-woocommerce/)
- [Como corrigir carrinho do WooCommerce que esvazia sozinho](https://full.services/wp-fixer/corrigir-carrinho-esvazia-woocommerce/)

## Causa

- Conflito de plugin (gateway, cache ou otimização de JS) quebrando o JavaScript do checkout do WooCommerce.
- Requisições AJAX para admin-ajax.php ou para a Store API bloqueadas por firewall/WAF ou retornando 403/500.
- Página de Checkout sem o shortcode [woocommerce_checkout] ou sem o bloco de Checkout, ou apontada para a página errada nas configurações.
- Tema desatualizado ou com template de checkout customizado incompatível com a versão atual do WooCommerce.
- Cache de página inteira cacheando o checkout (deveria ser sempre dinâmico), servindo um nonce ou fragmento expirado.

## Como resolver

1. Confirme a página de checkout: em WooCommerce > Configurações > Avançado, verifique se 'Página de finalização da compra' aponta para a página correta, e que ela contém o bloco Checkout ou o shortcode [woocommerce_checkout].
2. Teste com tema padrão e plugins desativados: ative temporariamente um tema padrão (Storefront/Twenty Twenty-Four) e desative os plugins exceto o WooCommerce. Se o checkout voltar, reative um a um para achar o conflito.
3. Exclua o checkout do cache: no plugin de cache, marque carrinho, checkout e minha conta como páginas que nunca devem ser cacheadas, e exclua o JS do WooCommerce da minificação/combinação.
4. Verifique o AJAX no console: abra o checkout, pressione F12 > aba Rede, tente finalizar e veja se admin-ajax.php ou a Store API retorna 403/500. Se sim, peça ao host/WAF para liberar essas rotas.
5. Atualize WooCommerce e o tema: atualize o WooCommerce e o tema para as versões mais recentes e cheque em WooCommerce > Status se há templates desatualizados (em vermelho) que precisam ser regerados.

## Código

```php
// functions.php — impede o cache de cachear paginas dinamicas do WooCommerce
// (carrinho, checkout e minha conta devem ser SEMPRE dinamicos)
add_action( 'template_redirect', function () {
    if ( function_exists( 'is_checkout' ) && ( is_checkout() || is_cart() || is_account_page() ) ) {
        if ( ! defined( 'DONOTCACHEPAGE' ) ) {
            define( 'DONOTCACHEPAGE', true );
        }
        nocache_headers();
    }
}, 0 );
```

## Perguntas frequentes

### O botão de finalizar compra não responde. Por onde começo?

Comece pelo console do navegador (F12). Erros de JavaScript ou requisições admin-ajax.php retornando 403/500 indicam conflito de plugin/tema ou bloqueio de AJAX. Teste com tema padrão e plugins desativados para isolar a causa.

### Por que o checkout diz que o carrinho está vazio?

Geralmente é cache servindo o checkout com a sessão errada, ou os cookies do WooCommerce não estão sendo gravados. Exclua carrinho e checkout do cache e confirme que o domínio (com e sem www) está consistente nas configurações.

### Um plugin de cache pode quebrar o checkout?

Sim, e é uma das causas mais comuns. O checkout precisa ser dinâmico; se for cacheado, o nonce de segurança expira e o botão de finalizar para de funcionar. Marque carrinho, checkout e minha conta como não-cacheáveis.

### A página de checkout abre em branco. O que fazer?

Confirme em WooCommerce > Configurações > Avançado se a página de checkout está atribuída e contém o bloco Checkout ou o shortcode [woocommerce_checkout]. Página em branco também pode ser erro fatal de PHP: ative o WP_DEBUG e veja o log.

### Atualizei o WooCommerce e o checkout parou. Como reverter?

Em WooCommerce > Status, verifique templates desatualizados marcados em vermelho: o tema pode ter uma cópia antiga do template de checkout. Atualize o tema ou remova o override; se precisar, use um plugin de rollback para voltar a versão estável.

### O checkout funciona no meu computador mas não no do cliente. Por quê?

Costuma ser cache no lado do cliente ou da CDN servindo uma versão antiga, ou uma extensão/navegador bloqueando o JavaScript. Limpe o cache da CDN, teste em aba anônima e confira se algum gateway exige configuração específica de domínio.

**Fonte:** [WooCommerce — Configuring WooCommerce Settings](https://woocommerce.com/document/configuring-woocommerce-settings/)
