Unix系OSのユーティリティであり常駐プログラムであるcronは、バックグラウンドで実行したいコマンドやサーバー上のスクリプトを指定、自動化するのに使用されます。この処理はcronジョブと呼ばれ、特定の時間、日付、または間隔でタスクを実行してくれる代物です。cronジョブは、自動化することで手間を削減できるような反復的なタスクに使用するのが一般的です。WordPressには、このcronを模したWP-Cron機能があります。
WordPressのcronジョブの主な用途としては、投稿の公開やバックアッププラグインのスケジュールの事前指定と実行など。この記事では、WordPressのcronジョブ(WP-Cron)の追加、編集、実行方法を見ていきます。
WordPressでのcronジョブの設定方法
まず言及しておきたいのは、WP-Cronとcronは別物であり、それぞれにメリットとデメリットがある点です。例えば、WP-Cronは、間隔に依存するのに対し、cronは特定の時間に基づきます。また、WP-Cronは、(バックエンドまたはフロントエンドで)ページが読み込まれた時にのみ機能することから、信頼性に欠けるというデメリットもあります。デフォルトのWP-Cronの間隔は、1時間毎、1日2回、毎日です。
WP-Cronイベントを追加するには、フックを作成する必要があります。詳細は、WordPress公式のプラグイン開発ハンドブック内WP-Cronイベントの作成方法をご覧ください。また、WordPressでcronジョブを実行する別の方法をお探しなら、Tom Mcfarlin氏のWordPressのcronジョブ定義に関する記事も参考になるはず。今回は、高度な専門知識を持たない方向けに、人気の無料プラグイン、WP Crontrolを使用してWP-Cronを設定する方法を見ていきます。WP-Cronの仕組みを理解して、使いこなしましょう。
WP Crontrolは、20万回以上のインストールと五つ星評価で4.5の評価を受けており、WordPressコミュニティの多くのメンバーに愛用されています。
「WP Controlは、本当に優秀なプラグインです。実行可能なcronジョブをすべて確認することができ、何が起こっているのか、何が実行できるのかを把握するのにもってこい。さらに新規cronジョブの作成や、既存のcronジョブをトリガーして実行することもできて文句無しです」─Josh Pollock氏(Caldera Forms開発者)
WordPressのリポジトリからダウンロードするか、WordPress管理画面の「プラグイン」>「新規追加」で検索して入手してください。WP Controlの主な機能は以下の通りです。
- 引数、スケジュール、コールバック関数、次回の予定時期とともに、すべてのcronイベントを表示
- 任意のcronイベントを編集、削除、実行
- 新規cronイベントの作成
- 任意のcronスケジュールの追加、編集、削除
サーバーのcronジョブ
Kinstaを利用されている場合は、サーバーのcronジョブが15分ごとにすべてのサイトで実行されます。Kinstaでサーバーのcronを管理する方法についてはこちらをご覧ください。
WP-Cronスケジュール
WP Controlプラグインを有効化し、管理画面から「設定」>「Cron スケジュール」に移動すると、WP-Cronジョブのスケジュールを変更することができます。デフォルトでは、毎週に設定されています。また、6時間ごとに2万1,600秒などというように、秒単位でスケジュールを追加することも可能です。
スケジュールは、以下のようなフィルターを使用したコードで追加することもできます。
add_filter( 'cron_schedules', 'example_add_cron_interval' );
function example_add_cron_interval( $schedules ) {
$schedules['five_seconds'] = array(
'interval' => 5,
'display' => esc_html__( 'Every Five Seconds' ),
);
return $schedules;
}
WP-Cronイベント
また、管理画面から「ツール」>「Cron イベント」に移動すると、すでに設定されているWP-Cronを確認することができます。フック名の多くは、「woocoomerce_cleanup_sessions」や「gravityforms_cron」など、プラグイン名の一部と一致する名前になっており識別が簡単です。
フック名の横にある「今すぐ実行」をクリックすると、すぐに実行可能です。これは、トラブルシューティングでcronイベントを複数回実行しなければならない時に有用になります。
WP-Cronイベントの編集
フック名の横にある「編集」をクリックすると、既存のcronイベントを編集することも。フック名、引数、次の実行、頻度を変更することができます。多くのプラグインが正常に動作するためにcronジョブに依存しているため、編集は慎重に行なってください。
WP-Cronイベントの追加
cronイベントを記述することも可能です。例として、DisqusプラグインのWP-Cronジョブを追加していきます。cronイベントの追加は、同期頻度の変更やコメントの同期に問題が生じた場合に役立ちます。サードパーティ製プラグインのドキュメントには、cronイベント名、またはフック名が記載されています。今回のDisqusのフック名は「dsq_sync_forum」です。
ゼロからcronイベントを記述する場合は、functions.phpファイルなど、コードのどこかに対応するアクションフックが必要になります。以下は、WP Controlの例です。
add_action( 'my_hookname', 'my_function' );
次に、関数を作成します。
function my_function() {
wp_mail( '[email protected]', 'WP Crontrol', 'WP Crontrol rocks!' );
}
Disqusの場合、まず600秒(10分)のcronイベントを追加します。次に、「Cron イベントの追加」をクリックし、フック名に「dsq_sync_forum」を入力した後、次の実行時間を指定して、頻度を10分に設定します。それから、画面下部の「Cron イベントの追加」をクリックして完了です。これで、DisqusのコメントがWordPressのデータベースで10分毎に自動で同期されるようになりました。
WP Controlの使用方法はこんなところです。使い勝手が良く、お勧めのプラグインです。
WP-CronのWP-CLI
WP-CLIでWP-Cronイベントやcronジョブを管理することも可能です。例えば、以下のコマンドを実行すると、現在のcronイベントが一覧で表示されます。
wp cron event list
追加のコマンドとパラメータについては、公式サイトのWP-CLI cronドキュメントをご覧ください。
cPanelでcronジョブを追加する方法
cPanelを採用するサーバーを利用している場合は、cPanelのコントロールパネルでcronジョブの管理が行えます。cPanelアカウントにログインして、「詳細」>「Cron ジョブ」に移動してください。
「Cron ジョブ」では、cronジョブの通知を設定したり、新規cronジョブを追加したりすることができます。cronジョブを追加するには、「新しいcronジョブの追加」セクションまでスクロールしてください。
すると、コマンドの頻度を指定することができます。
「共通設定」のドロップダウンメニューから、1分に1回や1年に1回など、頻度を選択することができます。または、その下のフィールドに任意の値を入力してください。
cronジョブの頻度を設定したら、「コマンド」フィールドに実行するコマンドを貼り付けます。「新しいcronジョブの追加」をクリックして、保存すれば完了です。これで、ページ下部の「現在のCronジョブ」に追加したcronジョブが表示されます。
NGINXでcronジョブを追加する方法
ターミナルの使用やスクリプトの記述に慣れている方であれば、NGINXでcronジョブを追加するのは比較的簡単です。まずはターミナルを開き、以下のコマンドを貼り付けます。
Sudo crontab -e
すると、cronの設定ファイルが開きます。ファイル内の行には、それぞれ以下のような異なるcronジョブが記述されています。
0 13 * * * /var/www/public_html/cron.php >/dev/null
Ngnixで新規cronジョブを追加するには、そのコマンドが何を処理するかを把握しなければなりません。最初の数字とアスタリスク(*)で、cronジョブの実行される日時を指定します。
順番(左から右)に、数字または記号を入力していきます。
- 分
- 時間
- 日
- 月
- 曜日
上のコマンドでは、NGINXにて毎日13時ちょうどにcron.phpファイルを実行するようになっています(不要なその他の値にはアスタリスクを使用)。
実行するファイルの指定に加えて、「>/dev/null」を貼り付けて、エラーの出力を破棄するように指示します。または、エラーの出力をログファイルに保存するようにするのも手です。
cronの設定ファイルの変更を終えたら、保存してファイルを閉じます。これで、NGINXサーバーで、設定した構成のcronジョブが実行されます。
Kinstaでcronジョブを追加する方法
Kinstaでcronジョブを追加するには、2つの方法があります。まず1つ目は、SSH経由でサイトに接続し、crontab -eコマンドを実行する方法。
このコマンドを実行すると、使用するエディターの選択が求められます。エディターを選択して、cronの設定ファイルを開きます。
新たな行に、以下のコマンドを貼り付けてください。
0 13 * * * /var/www/public_html/cron.php >/dev/null
cronコマンドの構成方法については、先ほどご紹介したNGINXでcrontab -eコマンドを使用する方法をご参照ください。cronジョブを自分で追加するのが不安な場合は、Kinstaのカスタマーサポートまでお気軽にご連絡ください。
Kinstaのカスタマーサポートでのcronジョブの編集はできかねますが、コマンドのアップロードを代行することは可能です。cronコマンドの設定については、crontabのドキュメントをご確認ください。
WP-Cronを無効にする方法
WP-Cronを使用すると、サイトに問題が発生することがあります。WP-Cronは、あくまでcronを模した機能であり、継続的に実行されるのではなく、ページの読み込み時にwp-cron.phpスクリプトが実行される仕組みです。
つまり、ページが読み込まれるたびにwp-cron.phpの実行にリソースが消費されるため、アクセスの多いサイトでは、時折問題が生じます。ページの読み込みに問題がありスクリプトが実行されないと、wp-cron.phpによる指定した間隔の認識が行われず、コマンドが失敗することがあります。
WP-Cronで問題が発生した場合は、WordPressのwp-config.phpファイルに以下のコードを貼り付けて、機能を無効にすることもできます。
define('DISABLE_WP_CRON', true);
コードを貼り付け変更を保存すればOKです。なお、WP-Cronを無効化する場合には、今回ご紹介したいずれかの方法で別のcronジョブを設定することをお忘れ無く。