wordpressで指定の時間にプログラムを自動実行させる【wp_schedule_event】の使い方

php, WEB制作, wordpress

wordpressには擬似的にcron処理を行える【wp_schedule_event】という関数が用意されています。
サンプルコードでは翌月の1日の00時00分に動作させるコードを書きました。

キーワードを変更するだけで、指定の時間に変更する事も出来ます。

wp_schedule_eventについて

関数リファレンス/wp schedule event – WordPress Codex 日本語版による解説。

指定された一定の期間をおいてWordPressのコアファイルによって実行されるアクションを登録します。アクションは誰かがサイトを訪れたときに、予定されていた時間をすぎていた場合、実行されます。

これを使えば毎日自動実行や時間毎に自動実行みたいな動作をさせる事が出来ます。
アイデア次第で色々な事が出来そうですね。

但し、誰かがサイトにアクセスしないと自動実行のアクションが登録されません。と、言っても最低1日1PVくらいは更新していればあるはずなので、半日に一回ぐらいの処理なら全然問題ないと思います。

時間毎や分単位の処理がしたい場合は、相当なアクセスが無いとおススメできないですね><

wp_schedule_eventの使用方法

コードを載せる前にご紹介。
使い方で非常に参考になった記事をご紹介します。
ほぼこちらのコードを流用させてもらっています。

この記事を参考に自分も実行させたい処理を何とか書ける事が出来ました。感謝!

wp_schedule_eventで擬似的にcron処理を行う | スキマ時間の実験室

では実際のコードです。

好きな時間に指定したい場合

9行目のイベントの時間追加で行えます。
このコードの例では【来月1日の日付が変わった瞬間】の時間が指定されるように書いています。

但し、上記コードはきっかり来月0時0分0秒に設定してあるので、サーバーの応答時間のタイムラグによってはアクションが当月末日23時59分59秒等になってしまう場合があります。

このタイムラグに対処する場合は、20行目の部分に変更を加えます。

差分の秒に+60(1分)足しています。

毎月1日では無くて、一年に一回、半年に一回、一週間に一回等に指定したい場合は13行目の【$dt_2 = new DateTime(‘midnight first day of next month’);】の【midnight first day of next month】のキーワードを変更すれば出来ます。

指定できるキーワード

指定できるキーワード(書式)のメモです。
需要がありそうな時間指定のサンプルは一番下に書きました。

シンボル一覧

シンボル キーワード
dayname ‘sunday’ | ‘monday’ | ‘tuesday’ | ‘wednesday’ | ‘thursday’ | ‘friday’ | ‘saturday’ | ‘sun’ | ‘mon’ | ‘tue’ | ‘wed’ | ‘thu’ | ‘fri’ | ‘sat’ | ‘sun’
daytext ‘weekday’ | ‘weekdays’
number [+-]?[0-9]+
ordinal ‘first’ | ‘second’ | ‘third’ | ‘fourth’ | ‘fifth’ | ‘sixth’ | ‘seventh’ | ‘eighth’ | ‘ninth’ | ‘tenth’ | ‘eleventh’ | ‘twelfth’ | ‘next’ | ‘last’ | ‘previous’ | ‘this’
reltext ‘next’ | ‘last’ | ‘previous’ | ‘this’
space [ \t]+
unit ((‘sec’ | ‘second’ | ‘min’ | ‘minute’ | ‘hour’ | ‘day’ | ‘fortnight’ | ‘forthnight’ | ‘month’ | ‘year’) ‘s’?) | ‘weeks’ | daytext

書式一覧

書式 解説
yesterday 前日の0時0分0秒
midnight 時刻を0時0分0秒にする
today 時刻を0時0分0秒にする
now 現在の日時・分・秒
noon 時間を12:00にする
tomorrow 翌日の0時0分0秒
back of 指定時間の15分後にする
front of 指定時間の15分前にする
first day of 現在月の1日
last day of 現在月の末日
ordinal space dayname space’of’ 指定月のx番目の曜日
‘last’ space dayname space’of’ 指定月の指定曜日
number space? (unit | ‘week’) 値を数値で指定するような、相対的な時間指定を処理します。
ordinal space unit 値を英単語で指定するような、相対的な時間指定を処理します。
‘ago’ 直前に指定された相対的な時間指定について、正負反転します。
dayname 現在からみて次にやってくる、指定された曜日にします。
reltext space ‘week’ 特別な書式”weekday + last/this/next week”を処理します。

分かりづらい書式の説明

ちょっと自分でも実行させながら確認したのですが、書き方が分かりにくかったり出力結果が分かりづらいキーワードがあったので、まとめてみました。

出力例の実行時間は【14年5月28日】です。
時・分・秒に関しては記事を書きながらテストしているので、大目に見てください。
(記事書くの遅いのですよ、すいません)

ordinal space dayname

シンボルのordinalに半角スペースをあけてdaynameを指定する書き方です。
対応シンボルで様々な時間指定方法が書けます。

書き方の例 意味 出力例
first fri 現在日時以降の最初の指定曜日 14年05月30日00時間00分00秒
third fri 現在日時以降の三回目の指定曜日 14年06月13日00時間00分00秒
last fri 現在日時以前の最後の指定曜日 14年05月23日00時間00分00秒
ordinal space dayname space of

ordinal space daynameの後にさらに条件を追加した書き方です。

書き方の例 意味 出力例
first fri of next month 来月の最初の指定曜日 14年06月06日00時間00分00秒
third fri of next month 来月の三回目の指定曜日 14年06月20日00時間00分00秒
last fri of next month 来月の最後の指定曜日 14年06月27日00時間00分00秒
number space? (unit | ‘week’)

数値で日付を指定します。
weekdaysは”平日”という意味なので、例えば3日後が土曜日だとすると+3weekdaysと指定しても、土日を飛ばして月曜日の日付になります。日本の祝日に対応しているかどうかは不明。土日を省きたい場合には使えるかな?

書き方の例 意味 出力例
5day 現在日時から5日後の日時・分・秒 14年06月02日07時間05分22秒
+3week 現在日時から3週間後の日時・分・秒 14年06月18日07時間07分00秒
+3 weekdays 土日を省いた現在から3日後の平日 14年06月02日00時間00分00秒
ago

簡単な解釈としては、ago直前に書かれた指定の反転
1day agoで一日前となるが、-1day agoで一日後になる。
また1day ago agoとする事でも一日前になる。

書き方の例 意味 出力例
1week ago 現在日時から一週間前の日時・分・秒 14年05月21日07時間35分51秒
1week ago 1day 現在日時から1週間前の一日後の日時・分・秒 14年05月22日07時間36分44秒
1week ago fri 現在日時から一週間以内の指定曜日 14年05月23日00時間00分00秒

実際の使用例

キーワードの組み合わせ次第で物凄い数のパターンになってしまうので、色々な書き方でよく使いそうなパターンを考えてみました。

キーワード 指定される時間 出力例
-1day 000000 前日の指定時間 14年05月27日12時間34分56秒
000000 今日の指定時間 14年05月28日12時間34分56秒
tomorrow 153015 翌日の指定時間 14年05月29日15時間30分15秒
this week mon 今週の指定曜日 14年05月26日00時間00分00秒
this week wed 162013 今週の指定曜日の指定時間 14年05月28日16時間20分13秒
+1 mon 来週の指定曜日、+2と数値を増やすことで再来週になる 14年06月02日00時間00分00秒
+1 week wed 162013 来週の指定曜日の指定時間 14年06月04日16時間20分13秒
last fri of this month 12pm 当月の最後の指定曜日、指定時間 14年05月30日12時間00分00秒
last day of 123015 当月の月末の指定時間 14年05月31日12時間30分15秒
-1month first day of next month 000000 当月の初日の指定時間 14年05月01日00時間00分00秒
-1month first mon of next month 000000 当月最初の指定曜日・時間 14年05月05日00時間00分00秒
-1month third sat of next month 000000 当月第三土曜日 14年05月19日00時間00分00秒
first day of next month 現在の時・分・秒の来月の初日(時・分・秒は実行時間) 14年06月01日19時間50分40秒
last day of 1month 000000 来月の月末の指定時間 14年06月30日00時間00分00秒

省略文早見表

曜日や月の記述は省略して書けるので、早見表を作ってみました。

元の文字列 省略文 意味
monday mon 月曜日
tuesday tue 火曜日
wednesday wed 水曜日
thursday thu 木曜日
friday fri 金曜日
saturday sat 土曜日
sunday sun 日曜日
january jan 1月
february feb 2月
march mar 3月
april apr 4月
may may 5月
june jun 6月
july jul 7月
august aug 8月
september sep 9月
october oct 10月
november nov 11月
december dec 12月

参考サイト

相対的な書式 (日付と時刻の書式) – PHPプロ!マニュアル
PHP: DateTime – Manual

この記事が気に入ったら
『いいね』しよう!