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.
• 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.
- Abra o checkout e abra as ferramentas de desenvolvedor (F12).
- Vá para a aba Network e filtre por
admin-ajax.phpouwc-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
actionindica qual função está sendo chamada (ex:wc_ajax_update_order_review).
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.logApós realizar ações no checkout, analise as queries que aparecem nesse log – elas são as candidatas a otimização.
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.

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”.
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.
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.
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.
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.
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.

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.
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.
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.
