2026年9月15日

2026年9月15日

WordPressのWP-Cronを本番環境で最適化する方法【サーバーCron・DISABLE_WP_CRON】

はじめに

WordPressのWP-Cronはデフォルトでページアクセス時にトリガーされる疑似Cronであり、トラフィックが少ない環境では定期処理が遅延したり実行されなかったりすることがあります。本番環境ではサーバーの実際のcrontabと組み合わせることで、安定した定期実行が実現できます。この記事では、WP-Cronを無効化してサーバーCronに移行する手順を詳しく解説します。

症状・原因

  • 投稿の予約公開が予定時刻に公開されない
  • メールの定期送信やバックアップが不定期にしか動かない
  • アクセスのたびにCronチェックが走りサイト表示が遅くなっている

解決手順

ステップ1:DISABLE_WP_CRONをwp-config.phpに設定する

WP-Cronはデフォルトでリクエストごとに実行チェックを行うため、本番環境では必ず無効化します。

<?php
// wp-config.php に追記
// WP-Cronの自動実行を無効化(サーバーCronで代替するため)
define( 'DISABLE_WP_CRON', true );

// Cronの重複実行を防ぐロックタイムアウト(秒)
define( 'WP_CRON_LOCK_TIMEOUT', 60 );

なぜ重要か: DISABLE_WP_CRONを設定しないと、全リクエストでCronチェックが走り、レスポンスタイムが増加します。高トラフィックサイトでは並列リクエストによるCronの多重起動も起こります。

ステップ2:crontabでwp-cron.phpを定期実行する

サーバーにSSHログインし、crontab -eで以下を設定します。

# wp-cron.phpを5分ごとにwgetで実行
# >/dev/null 2>&1 でログ出力を抑制
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

# curlを使う場合(タイムアウト30秒)
*/5 * * * * curl -s -o /dev/null --max-time 30 "https://example.com/wp-cron.php?doing_wp_cron"

ステップ3:WP-CLIを使ったcrontab設定(推奨)

WP-CLIが使える環境では、wp-cron.phpへのHTTPリクエストよりも直接実行の方が高速で確実です。

# WP-CLIを使って期限切れのCronイベントを実行
# /usr/local/bin/wp はWP-CLIのパスに合わせて変更
*/5 * * * * /usr/local/bin/wp cron event run --due-now --path=/var/www/html --quiet

# 複数サイト(マルチサイト)の場合はURL指定
*/5 * * * * /usr/local/bin/wp cron event run --due-now --url=https://example.com --path=/var/www/html

# 実行ユーザーをwww-dataに指定する場合
*/5 * * * * sudo -u www-data /usr/local/bin/wp cron event run --due-now --path=/var/www/html

ステップ4:Cronジョブの監視と一覧表示

登録されているCronイベントとスケジュールを確認する方法です。

# 登録済みのCronイベントを一覧表示
wp cron event list --path=/var/www/html

# 出力例:
# hook                    next_run_gmt         next_run_relative  recurrence
# wp_scheduled_delete     2024-01-15 10:05:00  1 minute           1 day
# publish_future_post     2024-01-15 10:10:00  6 minutes          None
# wp_privacy_delete_old_export_files  2024-01-15 10:00:00  now  1 hour

# 登録済みスケジュール(間隔)を確認
wp cron schedule list --path=/var/www/html

# 次の実行が遅延しているイベントをフィルタ
wp cron event list --path=/var/www/html --format=table | grep "ago"

ステップ5:失敗したCronのデバッグとエラーログ設定

Cronが実行されない場合のデバッグ手順です。

# 特定のフックを強制実行してテスト
wp cron event run wp_scheduled_delete --path=/var/www/html

# Cronのデバッグ情報をwp-config.phpに追加
# (本番環境ではデバッグ後に必ず削除)
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
<?php
// functions.phpにCronエラーロギングを追加
add_action( 'wp_cron_schedule_event_error', function( $result, $hook, $args ) {
    // Cronイベント失敗時にログ記録
    error_log( sprintf(
        '[WP-Cron Error] Hook: %s, Args: %s, Error: %s',
        $hook,
        json_encode( $args ),
        is_wp_error( $result ) ? $result->get_error_message() : 'unknown'
    ) );
}, 10, 3 );

注意事項

  • DISABLE_WP_CRON設定後の確認: crontabを設定する前にDISABLE_WP_CRONを有効にすると、その間Cronは一切実行されないため、設定は同時に行うこと。
  • WP-CLIのパス確認: which wpでWP-CLIのフルパスを確認してからcrontabに記述する。
  • タイムゾーンの一致: サーバーのタイムゾーンとWordPressのタイムゾーン(一般設定)が一致しているか確認する。

まとめ

WP-Cronをサーバーのcrontabに移行することで、定期処理の信頼性が大幅に向上します。DISABLE_WP_CRON設定・crontab登録・WP-CLIによる実行・監視の4ステップで安定した本番環境が実現できます。関連記事:WordPressのサーバー設定を最適化する方法

お気軽にご相談ください

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