1. HOME
  2. WEB制作
WEB制作 公開

記事更新日

WordPressには擬似的にcron処理を行える【wp_schedule_event】という関数が用意されています。

サンプルコードでは翌月の1日の00時00分に動作させるコードを書きました。

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

wp_schedule_eventについて

関数リファレンス/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秒

省略文早見表

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

元の文字列省略文意味
mondaymon月曜日
tuesdaytue火曜日
wednesdaywed水曜日
thursdaythu木曜日
fridayfri金曜日
saturdaysat土曜日
sundaysun日曜日
januaryjan1月
februaryfeb2月
marchmar3月
aprilapr4月
maymay5月
junejun6月
julyjul7月
augustaug8月
septembersep9月
octoberoct10月
novembernov11月
decemberdec12月

参考サイト

DateTime クラス