ワードプレス

WordPressでクーロン(wp-cron)を実行させる方法|スケジュールを自動起動できる

2018年5月3日

WordPress(ワードプレス)にはクーロン(wp-cron)と同じ動きができる機能があります。

これを使うと、「指定の時間」に「指定の処理を実行する」ことができるようになり、いろいろなプログラムを自動で実行できます。

例えば、時間がかかるバッチ処理を、夜中のアクセスが少ない時間に実行すれば、サイトにかかる負荷を軽減できます。

wp-cronを使ってスケジュール登録する方法と設定について紹介します。

便利なプラグイン「WP Control」

「WP Control」は、現在登録されているスケジュールを確認、実行、削除することができます。

wp-cronで登録したクーロンを操作できるので、テストで使います。必ず入れておきましょう。

起動間隔を自分で指定する方法

クーロン起動する間隔を自分で追加することもできます。

functions.phpかWP Controlのどちらでも設定できます。

初回登録されている間隔は4つです。

  • 1時間に1回
  • 1日2回(12時間おき)
  • 1日1回
  • 週1回

WP Controlは「Cron スケジュール」タグから簡単に追加できるので、functions.phpに書く方法を紹介しておきます。

起動間隔を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_schedule_event
  • wp_schedule_single_event

の2つがあります。

「wp_schedule_event」は、同じことをリピートしたい場合に使います。特に「毎週・毎日・毎時間・毎分」などの場合に使うと便利です。

「wp_schedule_single_event」は、繰り返しがない場合や、変則的なスケジュール(15日後・毎月特定の日など)の場合に使います。

メモ

「wp_schedule_single_event」は、起動する時間を自分で動的に設定して、繰り返し設定ができます。
「wp_schedule_event」の場合は、与えられた変数(hourly、daily、weeklyなど)しか使えないので「wp_schedule_single_event」の方が使い勝手がよいです。

wp-cronの基本的な書き方

起動したい関数を書いて「add_action」します。それを「wp_schedule_event」を使ってwp-cron起動します。

if文で「wp_next_scheduled」を使ってすでにwp-cron登録している場合は、登録しないようにしています。

もし、この確認をしないと、wp-cronがクーロンをチェックするたびにスケジュール登録するので、どんどんスケジュール登録が増えてしまいます。

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(日時を指定する変数)は、この時間に開始するという時間です。

一度起動すると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タイムで指定する必要があります。

例:日本の朝4時に起動させたい場合

strtotime(date('Ymd 19:00:00'));

「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);
}

などを使って、本番環境でのみ起動するように修正が必要になります。

-ワードプレス
-, , ,

© 2021 WPORZ