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 deletewp_schedule_eventで壊れたエントリを再登録、⑤大規模サイトはAction Schedulerで信頼性の高いスケジュール管理に移行します。

お気軽にご相談ください

お見積りへ お問い合わせへ