Página de checkout do WooCommerce com spinner de carregamento e ícone de rede lenta

Checkout lento no WooCommerce? Como otimizar as chamadas AJAX do carrinho

Um checkout lento é o pesadelo de qualquer lojista: cada segundo de atraso aumenta a taxa de abandono de carrinho em até 20%. No WooCommerce, a lentidão no checkout frequentemente está associada a chamadas AJAX excessivas ou mal otimizadas – aquelas requisições que atualizam o carrinho, recalculam frete, aplicam cupons e validam campos em tempo real. Este guia mostra, passo a passo, como diagnosticar o gargalo e aplicar correções que reduzem o tempo de resposta sem quebrar funcionalidades críticas.

✅ Ao final deste tutorial, você saberá:
• Identificar quais chamadas AJAX estão demorando (e por quê).
• Reduzir recálculos de frete com cache geolocalizado.
• Desativar atualizações desnecessárias do carrinho (cart fragments).
• Aplicar exclusões de hooks e ações no checkout.
• Configurar um sistema de filas para tarefas pesadas de checkout.

1. Por que o checkout do WooCommerce depende tanto de AJAX?

O WooCommerce, por padrão, utiliza AJAX para fornecer uma experiência dinâmica no checkout: ao alterar o CEP, o frete é recalculado; ao adicionar um cupom, o total é atualizado; ao mudar a quantidade, o carrinho é sincronizado. Porém, cada uma dessas ações dispara requisições para admin-ajax.php, que por sua vez executam hooks e consultas ao banco. Consequentemente, em lojas com muitos plugins (gateways, cálculos complexos, regras de desconto), uma única ação pode gerar dezenas de consultas SQL e scripts que demoram segundos. Portanto, otimizar essas chamadas é obrigatório para garantir um checkout ágil.

2. Diagnóstico: medindo a lentidão das chamadas AJAX

Antes de aplicar qualquer solução, identifique os endpoints problemáticos.

🔧 Passo 1: Use o Network tab do navegador (F12)
  • Abra o checkout e abra as ferramentas de desenvolvedor (F12).
  • Vá para a aba Network e filtre por admin-ajax.php ou wc-ajax.
  • Execute ações comuns (mudar CEP, adicionar cupom) e observe o campo Time. Requisições acima de 500ms indicam lentidão.
  • Clique em uma requisição para ver o payload: o parâmetro action indica qual função está sendo chamada (ex: wc_ajax_update_order_review).
🔧 Passo 2: Ative o log de queries lentas do MySQL

Edite o arquivo de configuração do MySQL (my.cnf) ou solicite à hospedagem:

slow_query_log = 1
long_query_time = 1
slow_query_log_file = /var/log/mysql/slow-queries.log

Após realizar ações no checkout, analise as queries que aparecem nesse log – elas são as candidatas a otimização.

🔧 Passo 3: Use o Query Monitor em staging

O plugin Query Monitor mostra, em tempo real, todas as consultas de uma requisição AJAX. Para usá-lo em staging, basta ativá-lo e abrir o checkout. Ele exibirá o tempo total da requisição, a quantidade de consultas e as mais lentas.

Network tab do navegador mostrando requisições admin-ajax.php com tempos altos

3. Solução #1: Desative o recálculo automático de frete em tempo real

O WooCommerce recalcula o frete sempre que o CEP é alterado. Esse processo pode ser pesado, especialmente se você tiver várias transportadoras ativas (Correios, JadLog, etc.) e regras complexas. Uma alternativa é alterar o comportamento para recalcular apenas quando o usuário clicar em um botão “Calcular frete”.

🔧 Adicione o seguinte snippet ao functions.php do tema (ou via Code Snippets):
add_filter('woocommerce_checkout_update_order_review_expiration', function($timeout) {
    return 86400; // 24 horas
});
// Isso NÃO remove o recálculo automático, apenas aumenta o cache.
// Para desativar completamente o recálculo em tempo real, use:
add_action('woocommerce_checkout_update_order_review', 'disable_instant_shipping_recalc', 1);
function disable_instant_shipping_recalc() {
    if (wp_doing_ajax() && isset($_POST['action']) && $_POST['action'] === 'update_order_review') {
        remove_all_actions('woocommerce_after_shipping_rate');
    }
}

Nota: Teste exaustivamente, pois desabilitar o recálculo pode causar inconsistências no frete exibido.

Uma abordagem mais segura é usar um plugin de cache de frete como WooCommerce Shipping Calculator Cache (gratuito) ou habilitar o recurso de “Shipping Sessions” disponível no WooCommerce 8.5+.

4. Solução #2: Reduza os fragments do carrinho (cart fragments)

O WooCommerce atualiza o mini‑carrinho (widget do carrinho) em cada requisição AJAX, mesmo em páginas que não exibem o carrinho. Essa atualização é desnecessária no checkout. Portanto, desative os fragments do carrinho nessa página.

🔧 Desative cart fragments na página de checkout:
add_action('wp_enqueue_scripts', 'disable_cart_fragments_on_checkout');
function disable_cart_fragments_on_checkout() {
    if (is_checkout()) {
        wp_dequeue_script('wc-cart-fragments');
        wp_deregister_script('wc-cart-fragments');
    }
}

Isso elimina requisições periódicas que mantêm o mini‑carrinho sincronizado, reduzindo o número de chamadas AJAX.

5. Solução #3: Limite os endpoints AJAX acionados por eventos de input

Por padrão, campos como CEP disparam requisições AJAX a cada caractere digitado. Uma melhoria é implementar um atraso (debounce) ou exigir que o usuário pressione Enter ou Tab. Isso reduz drasticamente chamadas desnecessárias.

🔧 Adicione JavaScript ao seu checkout (via tema ou plugin de snippets):
jQuery(document).ready(function($) {
    var timer;
    $('#billing_postcode, #shipping_postcode').on('keyup', function() {
        clearTimeout(timer);
        timer = setTimeout(() => {
            $(document.body).trigger('update_checkout');
        }, 800);
    });
});

Esse código aguarda 800ms de inatividade antes de disparar a atualização do checkout, evitando requisições a cada tecla pressionada.

💡 Dica: Combine essa técnica com o atraso de recálculo de frete para reduzir sobrecarga.

6. Solução #4: Remova hooks e ações desnecessárias do checkout

Muitos plugins adicionam callbacks aos hooks woocommerce_checkout_update_order_review e woocommerce_after_shipping_rate que são executados a cada requisição AJAX. Use o Query Monitor para listá-los e, se algum não for essencial, remova-o.

🔧 Exemplo de remoção de um hook problemático:
remove_action('woocommerce_checkout_update_order_review', 'some_plugin_function', 10);

Substitua some_plugin_function pelo nome da função (obtido no Query Monitor). Se o plugin não permitir remoção direta, você pode usar uma prioridade mais alta para desativar:

add_action('woocommerce_checkout_update_order_review', function() {
    remove_action('woocommerce_checkout_update_order_review', 'some_plugin_function', 10);
}, 1);

7. Solução #5: Habilite cache de objeto para sessões e transientes

O WooCommerce armazena dados de carrinho e frete em transientes e sessões. Com Redis ou Memcached, essas leituras deixam de ser consultas ao banco MySQL, reduzindo significativamente o tempo de resposta.

  • Instale e configure um servidor Redis em sua VPS (ou solicite à hospedagem).
  • Instale o plugin Redis Object Cache. Ative-o.
  • Verifique se o cache está funcionando na página de status do WooCommerce (WooCommerce → Status → Ferramentas).

Com cache de objeto ativo, as requisições AJAX que lêem dados de sessão ficam até 80% mais rápidas.

Painel do Redis Object Cache mostrando cache ativo e estatísticas

8. Solução #6: Substitua o Action Scheduler por cron real

O WooCommerce usa o Action Scheduler para tarefas assíncronas (atualizações de estoque, e-mails, etc.). Contudo, ele pode executar tarefas durante o checkout se houver pendências. Configure um cron real para processar a fila fora do ciclo de requisição.

// wp-config.php
define('WP_CRON_LOCK_TIMEOUT', 120);
define('DISABLE_WP_CRON', true);

Em seguida, adicione um cron job verdadeiro para executar wp action-scheduler run a cada minuto.

⚠️ Cuidado com plugins de segurança: Firewalls como Wordfence podem bloquear requisições AJAX consideradas suspeitas (ex: muitas alterações de CEP). Adicione regras de exceção para admin-ajax.php com os parâmetros wc-ajax e update_order_review.

9. Ferramenta extra: WooCommerce Checkout Block vs. Shortcode

O novo bloco de checkout (Checkout Block) do WooCommerce é significativamente mais performático que o shortcode tradicional

. Ele reduz chamadas AJAX e usa React para atualizações parciais. Se você ainda usa o shortcode, migre para o bloco (requer o plugin WooCommerce Blocks ativo).

10. Checklist pós-otimização

Após aplicar as soluções, valide com:

  • Reabra o Network Tab e meça o tempo das requisições wc-ajax=update_order_review. O ideal é abaixo de 300ms.
  • Teste em dispositivos móveis e com conexões lentas (simule 3G nas ferramentas de desenvolvedor).
  • Confira se cupons, frete e cálculos ainda estão corretos.
  • Monitore o log de erros do WordPress para possíveis warnings após remoção de hooks.
✅ Resumo das ações prioritárias:
1. Desative cart fragments no checkout.
2. Aplique debounce nos campos de CEP.
3. Ative cache de objeto (Redis).
4. Remova hooks desnecessários usando Query Monitor.
5. Migre para o bloco de checkout do WooCommerce.

🔧 Quer otimizar sua loja WooCommerce como um especialista?

No nosso catálogo, você encontra plugins de performance, cache de objeto e temas leves que transformam seu checkout.

🛒 Explorar catálogo →

Continue acompanhando o blog para mais guias de boas práticas em WordPress.

Para utilizar nosso site, é necessário concordar com nossos termos de consentimento, adesão e suporte. Por isso, recomendamos que você leia-os atentamente antes de prosseguir.