Woocommerce

Action Scheduler travado no WooCommerce: milhares de ações pendentes

A tela WooCommerce, Status, Ações agendadas mostra quarenta mil ações pendentes, e-mail de pedido não sai, estoque não baixa e o webhook do ERP nunca dispara. O culpado raramente é o WooCommerce: é o WP-Cron, que só roda quando alguém abre uma página. Loja com pouco tráfego, ou com DISABLE_WP_CRON ligado e sem crontab, deixa a fila parada.

Primeiro esvazie a fila na mão

O Action Scheduler traz comandos próprios no WP-CLI, que ignoram o WP-Cron. O subcomando status existe da versão 3.7 dele em diante, a que o WooCommerce 9.x carrega:

cd /var/www/sualoja/html

sudo -u www-data wp action-scheduler status
sudo -u www-data wp action-scheduler run --batch-size=100 --batches=20

O status devolve a contagem e a ação mais antiga de cada fila. Repita o run até as pendências pararem de cair. Pelo terminal você também escapa do timeout de PHP que derruba o processamento dentro de uma requisição.

Depois limpe o histórico concluído

A tabela wp_actionscheduler_actions guarda tudo que já rodou, e com milhões de linhas a consulta da fila fica lenta. O comando de limpeza cuida das duas tabelas na ordem certa:

sudo -u www-data wp action-scheduler clean --status=complete,canceled --before='7 days ago' --batch-size=500

sudo -u www-data wp db query "SELECT status, COUNT(*) FROM wp_actionscheduler_actions GROUP BY status;"

Se a tabela estiver grande demais para o clean terminar, dá pra apagar no SQL. Exporte o banco antes com wp db export, porque DELETE em produção não tem desfazer, e comece pelos logs, senão sobram órfãos em wp_actionscheduler_logs apontando para ações que já não existem:

DELETE l FROM wp_actionscheduler_logs l
  JOIN wp_actionscheduler_actions a ON a.action_id = l.action_id
  WHERE a.status = 'complete';

DELETE FROM wp_actionscheduler_actions WHERE status = 'complete';

E tire o WP-Cron do caminho

define( 'DISABLE_WP_CRON', true );

*/5 * * * * cd /var/www/sualoja/html && sudo -u www-data /usr/local/bin/wp cron event run --due-now --quiet

A primeira linha vai no wp-config.php, acima do comentário de parar de editar. A segunda entra no crontab do root chamando o wp como www-data: rodando como root, os arquivos gerados saem com dono errado e a loja passa a dar erro de permissão. Com o cron do sistema de cinco em cinco minutos, a fila não acumula mais.

Post Recentes

cron_schedules WordPress: intervalo de 5 minutos no WP-Cron

O WordPress só oferece hourly, twicedaily, daily e weekly. Use o filtro cron_schedules para criar um intervalo de 5 minutos…

16 horas atrás

E-mails do WooCommerce não chegam: como testar o envio de um pedido real

Dispare pela linha de comando o e-mail de um pedido que já existe na loja e descubra se a falha…

23 horas atrás

CodeIgniter 4 tela branca: CI_ENVIRONMENT e o erro que sumiu

Página em branco no CodeIgniter 4, sem nenhuma mensagem? O ambiente está em production e escondeu o erro. Troque o…

2 dias atrás

Google Consent Mode v2 no WordPress: default denied antes do gtag rodar

O Google Ads acusa consentimento ausente porque o gtag sobe antes do banner. Veja como injetar o default denied do…

3 dias atrás

Módulos PHP 8.3 faltando na Saúde do site do WordPress: como instalar

A tela Saúde do site avisa que faltam extensões como intl, imagick ou zip: instale no PHP 8.3, reinicie o…

3 dias atrás

Caso de teste PHPUnit a partir do bug: do relato solto para o teste que falha

Chegou um chamado sem passo a passo e sem exemplo. Veja como virar esse relato em um caso de teste…

4 dias atrás