コンテンツにスキップ

WordPress の cron を指定時間に実行する方法

メインイメージ

WordPress の cron は WordPress サイト上で特定の処理を定期的に実行するのに便利な仕組みです。 ただ、デフォルトの設定ではタスクの実行タイミングがサイトへのアクセスに依存するため WordPress の cron には次のような制約があります。

  • アクセスが少ないサイトの場合: cron の実行タイミングが安定しない
  • アクセスが多いサイトの場合: cron に消費リソースの多いタスクが含まれる場合、サーバーの負荷の少ない(=アクセスの少ない)時間に実行したいそれだと実行タイミングが安定しない、というトレードオフ問題がある

今回はこの制約を避けて WordPress の cron (以下「 WP-Cron 」)を指定時間に確実に実行する方法を紹介します。 なお今回は Linux サーバーを使用している前提とします。

確認時のバージョン

  • Wordpress 6.5.2

1. サーバー OS の cron を設定する

WordPress の cron を指定時間に実行する最も一般的な方法はサーバー OS の cron 機能を利用する形です。

原理としては、サーバー OS の cron で WordPress サイトにリクエストをかけて、 WordPress の内部で WP-Cron が走る、という流れになります。

今日多くのレンタルサーバーでは OS の cron 機能が標準で利用できるため、特別な準備や契約は必要ありません(契約中のサーバーが cron 機能をサポートしているかどうかわからない方はホスティング会社の仕様やヘルプのページを参照ください)。

例えば、 OS の cron で毎日 0 時 15 分に WP-Cron を実行したい場合は次のように cron 設定を記述します。

curl の場合:

15 0 * * * /usr/bin/curl -s https://example.com/wp-cron.php > /dev/null 2>&1

wget の場合:

15 0 * * * /usr/bin/wget -q -O - https://example.com/wp-cron.php > /dev/null 2>&1

補足:

  • https://example.com は実際の WordPress サイトの URL に置き換えてください
  • /usr/bin/curl/usr/bin/wget はそれぞれ有効なコマンドのパスに置き換えてください。有効なコマンドパスは which curl などで確認できますし、サーバー仕様ドキュメントで確認できることも多いです。

ここで、 curlwget は HTTP リクエストを行うためのコマンドです。 WP-Cron の呼び出しに関しては curlwget のどちらを使っても大差ないので、利用中のサーバーで利用可能なものでお好みのものを使ってください。 他のコマンドがよい場合は他のコマンドでも問題ありません。

先頭の 15 0 * * * などは実行タイミングを指定するものです。 スペース区切りの数字や * は前から順に分・時・日・月・曜日を表します。

cron 設定の確認には次のサイトなどが便利です。

Crontab.guru

WP-CLI を使う形も

ちなみに、 WordPress のコマンドラインツール WP-CLI をサーバーにインストールすれば、次のような形で HTTP リクエストを介さずに( curlwget を使わずに) WP-Cron を実行することもできます。

15 0 * * * /usr/local/bin/wp --path=/path/to/wordpress cron event run --due-now > /dev/null 2>&1

補足:

  • /usr/local/bin/wp は実際の WP-CLI のコマンドのパスに変更してください
  • /path/to/wordpress は実際の WordPress ディレクトリのパスに変更してください

2. WordPress 本体の cron 機能を無効にする

WordPress はサイトにリクエストがあったときに WP-Cron の処理を行うのがデフォルトの挙動になっていますが、ステップ 1 で OS の cron を使って WP-Cron を実行するよう設定した後はこの処理は必要なくなるので無効化してしまっても OK です。

具体的には設定ファイル wp-config.php に次の行を追加してください。

define( 'DISABLE_WP_CRON', true );

この設定をしなければ、 WordPress はページリクエストがある度に次の処理を行います。

  1. スケジューリングされたタスクの一覧をチェック
  2. 実行する必要があるタスクをすべて実行

この処理を無効化することはリソース使用量の削減とサイトパフォーマンスの安定化につながります。

注意点

  • OS の cron の実行間隔を適切に設定してください。実行間隔が短すぎると、サーバーに過度な負荷がかかることがあります。例えば * * * * * と設定する毎分コマンドが実行されてしまいます。
  • cron の実行ログを確認して、正しく動作しているかを確認するようにしてください。

WordPress.org プラグインハンドブック関連ページ