2026年7月17日
2026年7月17日
WordPressのWP-Cronが動かない問題を解決する方法
はじめに
WP-Cronはページが表示されるたびにスケジュールされたタスクを確認し実行します。アクセスが少ないサイトでは長時間タスクが実行されなかったり、高トラフィックサイトでは過負荷になる問題があります。サーバーのcronと組み合わせて確実に実行させます。
症状・原因
- 定期的なメール通知やバックアップが実行されていない
wp_schedule_eventで登録したタスクが動いていない- 管理画面のダッシュボードの更新チェックが遅い
- アクセスが少ない深夜のcronタスクが全く実行されない
DISABLE_WP_CRONを設定したままサーバーcronを忘れていた
解決手順
ステップ1:WP-Cron の状態を確認する
# 登録されているcronイベントを一覧表示
wp cron event list
# 実行が遅延しているイベントを確認(次回実行時刻が過去のもの)
wp cron event list --fields=hook,next_run_relative,schedule
# cronスケジュール一覧
wp cron schedule list
# 今すぐcronを手動実行
wp cron event run --due-now
# 特定のイベントを即時実行
wp cron event run weekly_db_size_check
# WP-Cron の URL が到達できるか確認
curl -I https://example.com/wp-cron.php?doing_wp_cron
# wp-cron.php へのアクセスが 200 OK を返すか確認
# 403/404 の場合は .htaccess やサーバー設定を確認
ステップ2:DISABLE_WP_CRON の設定を確認する
// wp-config.php の設定を確認
// ❌ DISABLE_WP_CRON=true かつサーバーcronが未設定 → cronが全く動かない
define('DISABLE_WP_CRON', true);
// ✅ DISABLE_WP_CRON=true にする場合は必ずサーバーcronで代替する
// ✅ 低〜中トラフィックサイトは DISABLE_WP_CRON を設定しない(デフォルト動作)
# wp-config.php の DISABLE_WP_CRON 設定を確認
wp config get DISABLE_WP_CRON
# 設定を削除(デフォルトWP-Cron動作に戻す)
wp config delete DISABLE_WP_CRON
# または false に変更
wp config set DISABLE_WP_CRON false --raw
ステップ3:サーバーcron で WP-Cron を確実に実行する
# crontab を編集
crontab -e
# 毎分 WP-Cron を実行する設定(推奨)
* * * * * php /var/www/html/wp-cron.php > /dev/null 2>&1
# または WP-CLI を使う方法(より確実)
* * * * * wp --path=/var/www/html cron event run --due-now >> /var/log/wp-cron.log 2>&1
# wp-config.php で WP-Cron を無効化(二重実行を防ぐ)
# define('DISABLE_WP_CRON', true);
# サーバーcron の実行確認
tail -f /var/log/wp-cron.log
# crontab の現在の設定を確認
crontab -l
ステップ4:cronイベントのデバッグと修復
// functions.php: cronが実行されたかログに記録
add_action('my_scheduled_event', function(): void {
error_log('[cron] my_scheduled_event executed at ' . current_time('mysql'));
// タスクの処理
});
// cronが正しく登録されているか確認する関数
function debug_cron_status(): void {
$crons = _get_cron_array();
foreach ($crons as $timestamp => $hooks) {
foreach ($hooks as $hook => $events) {
$diff = $timestamp - time();
error_log(sprintf(
'[cron debug] %s: next run in %d seconds (%s)',
$hook,
$diff,
date('Y-m-d H:i:s', $timestamp)
));
}
}
}
# 壊れた cron エントリを削除して再登録
wp cron event delete weekly_db_size_check
# イベントを即時登録(次の実行を今すぐにスケジュール)
wp eval "wp_schedule_event(time(), 'weekly', 'weekly_db_size_check');"
# cronの全イベントをリセット(緊急時)
wp eval "_set_cron_array([]);"
wp cron event list # 空になっていることを確認
# その後プラグイン/テーマを再有効化してcronを再登録させる
ステップ5:WP-Cron の代替として Action Scheduler を使う
// composer.json または functions.php:
// WooCommerce 等の大規模サイトでは Action Scheduler が信頼性が高い
// Action Scheduler(WooCommerce に同梱)を使う場合
if (function_exists('as_schedule_recurring_action')) {
// 1時間ごとに実行
if (!as_next_scheduled_action('my_hourly_task')) {
as_schedule_recurring_action(
time(),
HOUR_IN_SECONDS,
'my_hourly_task'
);
}
}
add_action('my_hourly_task', function(): void {
// タスクの処理
error_log('[AS] my_hourly_task ran at ' . current_time('mysql'));
});
注意事項
DISABLE_WP_CRON=trueを設定した後でサーバーcronを設定し忘れると、バックアップ・メール通知・プラグインの定期処理が全て止まります。設定変更後は必ずwp cron event listで確認してください- 共有ホスティングではcrontabが使えない場合があります。コントロールパネル(cPanel等)の「cronジョブ」機能か、wp-cron.phpへの定期アクセスをUptimeRobot等の外部監視サービスで代替できます
- WP-Cronは訪問者のリクエストに乗って実行されるため、アクセスがない時間帯は動きません。毎朝3時のバックアップなど時刻指定が重要なタスクは必ずサーバーcronを使ってください
まとめ
WP-Cron動作不良の解決は①wp cron event listで登録済みイベントと遅延を確認、②wp config get DISABLE_WP_CRONで誤った無効化設定を確認・削除、③crontabで * wp --path=/... cron event run --due-nowを設定しサーバーcronで確実に実行、④wp cron event deleteとwp_schedule_eventで壊れたエントリを再登録、⑤大規模サイトはAction Schedulerで信頼性の高いスケジュール管理に移行します。