WordPress(ワードプレス)にはクーロン(wp-cron)と同じ動きができる機能があります。
これを使うと、「指定の時間」に「指定の処理を実行する」ことができるようになり、いろいろなプログラムを自動で実行できます。
例えば、時間がかかるバッチ処理を、夜中のアクセスが少ない時間に実行すれば、サイトにかかる負荷を軽減できます。
wp-cronを使ってスケジュール登録する方法と設定について紹介します。
Contents
wp-cronの起動の仕組み
WordPressのwp-cronはサーバーのcronとは違い、サイトにアクセスがあった時、設定されているスケジュールがあると処理が実行されます。
- 【09:00】に実行するスケジュールを登録する
- 【09:01】にサイトにアクセスがあった
- 【09:01】に09:00に登録したスケジュールが実行される
そのため、アクセスがないサイトの場合は、スケジュールが実行されないこともあります。
また、実行時間はアクセスがあった時間なので、スケジュールで設定した時刻で実行されないことがある点にも注意が必要です。
アクセスが少ないサイトの場合、自分でページや管理画面にアクセスして実行させることはできます。
便利なプラグイン「WP Control」
「WP Control」は、現在登録されているスケジュールを確認、実行、編集、削除ができます。
スケジュール登録したwp-cronを操作できるので、テストで使えます。入れておくと何かと便利です。
起動間隔を自分で指定する方法
クーロン起動する間隔を自分で追加することもできます。
functions.phpかWP Controlのどちらでも設定できます。
初回登録されている間隔は4つです。
- 1時間に1回
- 1日2回(12時間おき)
- 1日1回
- 週1回
※1日2回(12時間おき)がないことがあります。
WP Controlを使って「Cron スケジュール」から追加することもできます。
起動間隔をfunctions.phpに書く方法
WP Controlを使わずに、functions.phpに書く方法もあります。
functions.phpに下記のコードを追加します(intervalの部分を秒数で入力します)。
ただし、wp-cronがクーロンをフックするのが60秒になっているので、60秒以下に設定しても基本的にうまく動きません。
function cron_add_20sec( $schedules ) { $schedules['20sec'] = array( 'interval' => 20, 'display' => __( '20秒1回' ) ); return $schedules; } add_filter( 'cron_schedules', 'cron_add_20sec' );
メモ
上記は20秒で設定したい場合ですが、60秒以下なので正確に起動しません。
※あくまでサンプルです。
細かいスケジュールの設定は、WP Controlでは難しいのでプログラムに書く必要があります。
以下から、スケジュール登録するコードを紹介します。
wp-cron起動(クーロン)で使う関数
wp-cronを起動する関数には、
- wp_schedule_event
- wp_schedule_single_event
の2つがあります。
「wp_schedule_event」は、同じことをリピートしたい場合に使います。特に「毎週・毎日・毎時間・毎分」などの場合に使うと便利です。
「wp_schedule_single_event」は、繰り返しがない場合や、変則的なスケジュール(15日後・毎月特定の日など)の場合に使います。
wp-cronの基本的な書き方
「wp_schedule_event」でスケジュール登録し、スケジュールで実行したい関数とスケジュールを「add_action」で関連付けます。
「wp_next_scheduled」を使ってすでにスケジュールの重複登録を防ぐようにします。
function hoge_function() { // //実行したい内容 // } add_action ( 'hoge_add_cron', 'hoge_function' ); //cron登録処理 //スケジュール2重登録防止 if ( !wp_next_scheduled( 'hoge_add_cron' ) ) { // //9時間差がある // wp_schedule_event( strtotime(date("Ymd 3:00:00")), 'daily', 'hoge_add_cron' ); }
「wp_schedule_event」の最初のarg(日時を指定する変数)は、スケジュールを実行したい時間をUTCで登録します。
※UTC+9で登録すると時間がずれます。
一度起動すると2つ目のargに設定された「dailyなどの変数」によってリピート起動されます。
※リピート起動もアクセスがあったタイミングが実行タイミングなので、アクセスがないサイトだと起動しません。
UNIXタイム
WordPressのクーロンは、スケジュール設定時にUNIXタイムを指定します。
PHPで、UNIXタイムで特定時刻を指定する方法
//今日の2時をUNIXタイムにする $tt = strtotime(date('Ymd 02:00:00'));
また、Wordpressで登録する日付はUNIXタイムで、日本時間とは9時間の差があります。
メモ
日本時間は「UNIXタイム+9時間」
日本時間の朝9時にクーロンを起動したい場合は、-9時間した日付をUNIXタイムで指定する必要があります。
strtotime(date('Ymd 19:00:00'));
WordPressで扱う日付については、下記を参考にしてください。
-
WordPressの日付・時刻の取得【unixtimeとローカル時刻の取得】
unixtimeと日本のローカル時刻では、9時間の違いがあります。 WordPressでどの関数でどの日時を取得できるかを知っておかないと、日付データの設定する時にうまくいきません。 WordPres ...
「wp_schedule_single_event」でリピート起動する
「wp_schedule_single_event」は最初のarg(日時を指定する変数)に指定した時刻に1度だけスケジュールを実行します。
1度だけ起動するのは、日付を固定日付にした場合で、日付を動的に設定すれば、好きな時に1度だけ起動できるので、リピート起動のようなことができます。
動的にする場合は「mktime」を使うと便利です。
下記の例だと15分ごとにスケジュール起動します。
function hoge_function() { // //実行したい内容 // } add_action ( 'hoge_add_cron', 'hoge_function' ); //cron登録処理 //スケジュール2重登録防止 if ( !wp_next_scheduled( 'hoge_add_cron' ) ) { // //9時間差がある // wp_schedule_single_event( strtotime(date('Ymd H:00:00', mktime(date('H'), date('i')+15, 0, date('m'), date('d'), date('Y')))), 'hoge_add_cron' );//7時 }
毎月15日に起動させたい場合も「wp_schedule_single_event」を使えばできます。
メモ
mktimeで「date('m')+1」と指定しているので、翌月からスタートになります。当月分は自分で起動させる必要があります。
function hoge_function() { // //実行したい内容 // } add_action ( 'hoge_add_cron', 'hoge_function' ); //cron登録処理 //スケジュール2重登録防止 if ( !wp_next_scheduled( 'hoge_add_cron' ) ) { // //9時間差がある // wp_schedule_single_event( strtotime(date('Ymd H:i:s', mktime(0, 0, 0, date('m')+1, 15, date('Y')))), 'hoge_add_cron' );//7時 }
エラーがでる場合
起動した場合に出たエラーと解決方法を紹介しておきます。
Maximum execution time of 60 seconds exceeded
Fatal error: Maximum execution time of 60 seconds exceeded
などのエラーがでる場合があります。処理時間がオーバーする場合は、処理時間を延長させることで回避できます。
set_time_limitで処理時間に3600(1時間)を設定しておけばほとんとの場合は問題ないと思います。
参考:処理時間の延長方法
問題:予期しない HTTP 応答コード: 401
サイトの WP-Cron システムへの呼び出しが頻発する問題がありました。 つまり、サイトの WP-Cron イベントが機能しない可能性があります。
問題:予期しない HTTP 応答コード: 401。
サイトをBasic認証で非公開にしている場合に起こります。htaccessで特定IPだけ許可するか、Basic認証を取っ払うか。
特にテスト環境でやっている場合は、本番で稼働させればうまくいくことがあります。
//指定のドメインでなければ処理終了 if($_SERVER['HTTP_HOST']!='xxxxxx.com') { exit(1); }
などを使って、本番環境でのみ起動するように修正が必要になります。
-
wp_schedule_eventで登録したコールバック関数の中身をデバッグする方法【メモ】
WordPressでは疑似クーロン(wp-cron)を使って、一定時間経過後に関数(コールバック関数)を呼び出すタイマー機能を実装できます。 そこで使うのが下記のWordPressの関数です。 スケジ ...