WordPressには擬似的にcron処理を行える【wp_schedule_event】という関数が用意されています。
サンプルコードでは翌月の1日の00時00分に動作させるコードを書きました。
キーワードを変更するだけで、指定の時間に変更する事も出来ます。
wp_schedule_eventについて
指定された一定の期間をおいてWordPressのコアファイルによって実行されるアクションを登録します。アクションは誰かがサイトを訪れたときに、予定されていた時間をすぎていた場合、実行されます。
これを使えば毎日自動実行や時間毎に自動実行みたいな動作をさせる事が出来ます。アイデア次第で色々な事が出来そうですね。
但し、誰かがサイトにアクセスしないと自動実行のアクションが登録されません。と、言っても最低1日1PVくらいは更新していればあるはずなので、半日に一回ぐらいの処理なら全然問題ないと思います。
時間毎や分単位の処理がしたい場合は、相当なアクセスが無いとおススメできないですね><
wp_schedule_eventの使用方法
コードを載せる前にご紹介。
使い方で非常に参考になった記事をご紹介します。
ほぼこちらのコードを流用させてもらっています。
この記事を参考に自分も実行させたい処理を何とか書ける事が出来ました。感謝!
wp_schedule_eventで擬似的にcron処理を行う
// イベントの作成
add_action('my_hourly_event', 'my_hourly_action');
function my_hourly_action() {
// ここに動作させる処理を書く
}
// イベントの時間追加
add_filter('cron_schedules', 'my_interval' );
function my_interval($schedules) {
date_default_timezone_set( 'Asia/Tokyo' );
$dt = new DateTime('now');
$dt_2 = new DateTime('midnight first day of next month');
$d = $dt_2->diff($dt, true);
$dt_array = get_object_vars($d);
$day = $dt_array["d"] * 24 * 60 * 60;
$hour = $dt_array["h"] * 60 * 60;
$minutes = $dt_array["i"] * 60;
$second = $dt_array["s"];
$difftime = $day + $hour + $minutes + $second;
$schedules['Nextmonth'] = array(
'interval' => $difftime,
'display' => 'Nextmonth'
);
return $schedules;
}
function my_activation() {
// イベントが未登録なら登録する
if(!wp_next_scheduled('my_hourly_event')){
wp_schedule_event(time(), 'Nextmonth', 'my_hourly_event');
}
}
add_action('wp', 'my_activation');
// イベント排除
register_deactivation_hook(__FILE__, 'my_deactivation');
function my_deactivation() {
wp_clear_scheduled_hook('my_hourly_event');
}
好きな時間に指定したい場合
9行目のイベントの時間追加で行えます。
このコードの例では【来月1日の日付が変わった瞬間】の時間が指定されるように書いています。
但し、上記コードはきっかり来月0時0分0秒に設定してあるので、サーバーの応答時間のタイムラグによってはアクションが当月末日23時59分59秒等になってしまう場合があります。
このタイムラグに対処する場合は、20行目の部分に変更を加えます。
$difftime = ($day + $hour + $minutes + $second + 60);
差分の秒に+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月 |