2026年9月4日
2026年9月4日
WP-CLIのcronコマンドの使い方(cron event runとサーバーcronへの置き換え)
WP-CLI の wp cron event run を使うと、WordPress の予約処理(WP-Cron)を好きなタイミングで手動実行できます。さらに DISABLE_WP_CRON でアクセス時の自動実行を止め、サーバーの cron から wp cron event run --due-now を定期実行すれば、アクセス数に左右されずに予約投稿やバックアップなどの処理を動かせます。この記事では、イベントの確認・実行・登録・削除のコマンドと、サーバー cron への置き換え手順、ログの残し方を説明します。
WP-Cron の仕組みと困りごと
WP-Cron は、本物の cron のように決まった時刻に動くわけではありません。サイトにアクセスがあったときに「実行時刻を過ぎたイベントがあるか」を確認し、あればその場で実行する仕組みです。そのため次のような問題が起きます。
- アクセスが少ないサイトでは、予約投稿の公開やメール送信が遅れる
- アクセスが多いサイトでは、確認処理が頻繁に走ってサーバーの負荷になる
- サーバーの設定によっては、WordPress が自分自身へ送るリクエスト(ループバック)が失敗し、イベントがまったく実行されない
WP-CLI の cron コマンドは、こうした問題の調査と対策の両方に使えます。
登録されているイベントを確認する
まずは、どのイベントがいつ実行される予定かを確認します。
# イベント一覧(フック名・次回実行時刻・繰り返し間隔)
wp cron event list
# 列を指定して表示
wp cron event list --fields=hook,next_run_relative,recurrence
# 登録されている繰り返し間隔の一覧
wp cron schedule list
next_run_relative に「now」や過去を示す表示が並んでいる場合は、実行時刻を過ぎたのに処理されていないイベントが溜まっている状態です。wp cron schedule list では、hourly・twicedaily・daily・weekly といった WordPress 標準の間隔と、プラグインが追加した間隔を確認できます。
WP-Cron がアクセス経由で起動できる状態かは、次のコマンドで確認できます。
wp cron test
ループバックのリクエストが失敗している場合はここでエラーになります。後述の DISABLE_WP_CRON を設定している場合もエラーとして報告されますが、その場合はサーバー cron で動かす前提なので問題ありません。
wp cron event run でイベントを実行する
# 特定のフックを今すぐ実行
wp cron event run wp_scheduled_delete
# 実行時刻を過ぎたイベントをすべて実行
wp cron event run --due-now
# 時刻に関係なく、登録済みのイベントをすべて実行
wp cron event run --all
フック名を指定すると、そのフックに登録されたイベントが実行時刻を待たずに実行されます。自作プラグインの定期処理が正しく動くかを確かめたいときに便利です。
日常的な運用で使うのは --due-now です。WP-Cron が本来行う「時刻を過ぎたものだけを実行する」動作を、コマンドから行います。--all は実行予定が先のイベントまでまとめて動かすため、バックアップや一斉メール送信のような重い処理が想定外のタイミングで走ることがあります。本番では、何が実行されるかを wp cron event list で確認してから使ってください。
イベントを登録・削除する
# 1時間ごとに実行するイベントを今から登録
wp cron event schedule my_custom_hook now hourly
# 1回だけ、指定した時刻に実行するイベントを登録
wp cron event schedule my_custom_hook '+1 hour'
# フックに登録されたイベントを削除
wp cron event delete my_custom_hook
wp cron event schedule は、フック名・初回実行時刻・繰り返し間隔の順に指定します。初回の時刻には now や +1 hour のような相対表記、またはUNIXタイムスタンプが使えます。繰り返し間隔を省略すると1回だけのイベントになります。登録するだけでは処理は何も起きず、そのフックに add_action() で処理をつないでおく必要があります。
削除は、無効化したプラグインが残していったイベントの掃除に役立ちます。ただし、有効なプラグインが使っているイベントを消すと機能が止まり、プラグインによっては次の読み込み時に再登録されることもあります。フック名から何の処理か判断できないものは消さないようにします。引数やオプションの詳細は wp help cron event schedule で確認できます。
DISABLE_WP_CRON とサーバー cron に置き換える
アクセス時の自動実行を止め、サーバーの cron から定期的に実行する構成にすると、実行間隔が安定し、アクセスごとの負荷もなくなります。
1. wp-config.php で自動実行を止める
define( 'DISABLE_WP_CRON', true );
/* That's all, stop editing! */ の行より上に追記します。この設定を入れた時点で、アクセス経由の WP-Cron は動かなくなります。次の手順のサーバー cron を設定し忘れると、予約投稿などが一切実行されなくなるので、2つの作業はセットで行ってください。
2. サーバーの cron に登録する
Webサーバーと同じユーザーの crontab に登録します(例:sudo crontab -u www-data -e)。
*/5 * * * * /usr/local/bin/wp cron event run --due-now --path=/var/www/example.com/public_html >> /var/log/wp-cron/example.log 2>&1
5分ごとに、実行時刻を過ぎたイベントを処理する設定です。つまずきやすい点は次のとおりです。
- cron の実行環境は
PATHが最小限なので、wpはフルパスで書きます。which wpで場所を確認できます。 --pathで WordPress のフォルダを指定します。指定しないと「WordPress が見つからない」というエラーになります。- root の crontab で動かすと
--allow-rootが必要になるうえ、作成されたファイルの所有者が root になってしまいます。Webサーバーのユーザーで動かすほうが安全です。 - ログの出力先フォルダは事前に作成し、cron を実行するユーザーが書き込めるようにしておきます。
レンタルサーバーで crontab を直接編集できない場合は、管理画面の cron 設定に同じコマンドを登録します。WP-CLI が使えないサーバーでは、curl -s 'https://example.com/wp-cron.php?doing_wp_cron' > /dev/null のように wp-cron.php へアクセスする方法もあります。
処理が5分以上かかる重いイベントがある場合は、前回の実行が終わる前に次が始まらないよう、flock で多重起動を防ぐ方法もあります。
*/5 * * * * flock -n /tmp/wp-cron-example.lock /usr/local/bin/wp cron event run --due-now --path=/var/www/example.com/public_html >> /var/log/wp-cron/example.log 2>&1
ログで動作を確認する
設定後は、ログに実行結果が記録されているかを確認します。wp cron event run は、実行したイベントごとのメッセージと、最後に実行件数を出力します。
tail -n 50 /var/log/wp-cron/example.log
実行件数が毎回0件なのに wp cron event list で過去の時刻のイベントが残っている場合は、cron 自体が動いていないか、別のWordPressを指している可能性があります。ログに PHP のエラーが出ている場合は、そのイベントを wp cron event run フック名 で単独実行すると原因を絞り込めます。ログは放っておくと大きくなるので、logrotate などで定期的に整理してください。
マルチサイトでは、--due-now はメインサイト(または --url で指定したサイト)のイベントしか処理しません。すべてのサイトを処理するには、wp site list --field=url で取得したURLごとに --url を付けて実行するスクリプトを cron に登録します。
(2026年10月現在)ここで紹介したコマンドは WP-CLI の現行版で使えますが、オプションの細部はバージョンによって異なる場合があります。手元の環境では wp help cron event run で確認してください。
まとめ
wp cron event listで予定を確認し、wp cron testでアクセス経由の起動に問題がないかを調べるwp cron event run フック名で個別実行、--due-nowで時刻を過ぎたものだけ、--allは内容を確認してから使うwp cron event schedule/wp cron event deleteでイベントを登録・削除するDISABLE_WP_CRONとサーバー cron のwp cron event run --due-now --path=...はセットで設定する- cron はWebサーバーのユーザーで動かし、ログを残して実行件数とエラーを確認する