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のサーバー設定を最適化する方法