WordPressで擬似cronを使ってバッチ処理を定期実行させる方法
こんにちは。スタッフのユースケです。
今日はWordPressの定期実行に関するお話しです。
WordPressで定期的にバッチ処理を行いたいなんてことありませんか?
例えば、外部サイトから定期的にデータを取得してコンテンツを更新したり、イベント開催の1週間前にリマインドメールを配信したり。
そんなとき、定期的に処理を実行してくれる仕組みがWordPressにはあります。
「wp_cron」です。
ただし、この「wp_cron」は擬似的なcronで、指定した時間に必ず実行されるものではありません。
「wp_cron」の仕組みは下記のようになっています。
- サイトにアクセスがある(管理画面でもOK)
- 「wp_cron」が、スケジューラーに登録されているイベントの実行時間が経過しているかチェック
- 経過しているイベントがあれば、該当処理を実行
よって、処理がスケジューリングされていても、サイトにアクセスがなければ実行はされませんし、アクセスのあった時間が基準となるため、確実に指定時間に実行されるわけではありません。
(※もし、指定時間に確実に実行したいのであれば、サーバー側のcron を使用すれば可能です。
ただし、レンタルサーバーでは使用できないこともあります。)
それでは、実際に定期実行する処理を登録してみましょう。
テストメールを送信する処理をサンプルとして登録してみます。
// メール送信処理 function sample_remind_mail() { wp_mail( ’xxx@xxx.jp’, 'テストタイトル', 'テストメッセージ' ); } add_action ( 'sample_add_cron', 'sample_remind_mail' ); // cron登録処理 if ( !wp_next_scheduled( 'sample_add_cron' ) ) { wp_schedule_event( time(), 'daily', 'sample_add_cron' ); }
上から順番に説明しますと、まずメール送信を行う処理を「sample_add_cron」というwp_schedule_eventでスケジューラーに登録しています。
「wp_next_scheduled」は、スケジューラーにイベントが登録されているか確認するものです。
「wp_schedule_event」の引数はそれぞれ下記の通りです。
- 第1引数:最初に実行する時間
- 第2引数:実行間隔
- 第3引数:実行する処理のフック名
実行間隔は、「hourly」(毎時)、「twicedaily」(日に2回)、「daily」(毎日)があります。
これで、テストメールを送信する処理が毎日実行されます!
あとは、フックしている関数をカスタマイズして、定期実行したい処理に変えてみてくださいませ。
以上で定期実行処理の登録は完了ですが、プラスアルファでWordPressのCronに関する便利なプラグインを紹介します!
「WP Crontrol」
これはスケジューラーに登録されているイベントの確認・編集・削除・実行ができるプラグインです!
公式ディレクトリに掲載されているプラグインですので、通常どおりインストールできます。
インストールすると、「ツール」に「Crontrol」というメニューが追加されます。
ここをクリックすると、現在登録されているイベントを確認できます。
このように、プラグインやテーマの更新チェックなど、デフォルトでいくつかのイベントが登録されていますね。
先ほどの登録処理を実行すると、ここにイベントが追加されます。
各イベントの右側にあるリンクで編集・削除・実行ができます。
「Run Now」:イベントの即時実行
これを利用すると登録したイベントの動作確認ができるので、便利ですね!
「Delete」:イベントの削除
WordPressのデフォルトで登録されているものを消さないように注意してください!
「Edit」:登録内容の変更
「Hook name」と「Arguments」は処理が正しく動かなくなる可能性もあるので、変更する際は注意してください。
「Next run」で次回実行される時間を変更できます。
「Event Schedule」で実行サイクルを変更できます。
如何でしたか?「wp_cron」
週1・月1でやっていたサイト更新作業などなど、めんどくさいルーチンワークをcron登録して、メンテナンスコストの軽減にトライしてみてください!