NTTドコモ様_dカーシェア
NTTドコモ様_dカーシェア
2013.05.16

ルーティンを効率化。WordPressで定期的な処理をさせる方法

小林

お世話になっております。エンジニアの小林です。

WordPressで時間を指定して、または定期的に処理を行いたい場合の方法について書かせていただきます。

ご存知かもしれませんが、WordPressには元々そのような機能が提供されています。

例えば、公開日を未来に設定して行う予約投稿などにはこの機能が利用されていたかと思います。

この機構を利用して、独自の処理を定期的に行う簡単な例を示します。

定期的に行う関数の準備

定期的に行いたい処理を記述した関数を準備します。

function do_this_hourly () {

	// do something every hour

}

独自のアクションフックの追加

作成した関数を実行する独自のアクションフックを追加します。

add_action( 'my_hourly_event', 'do_this_hourly' );

新しいスケジュールイベントの追加

追加した独自のアクションフックを、時間を指定して、または定期的に実行されるようにします。

function my_activation() {
	if ( ! wp_next_scheduled( 'my_hourly_event' ) ) {
		wp_schedule_event( time(), 'hourly', 'my_hourly_event' );
	}
}
add_action('wp', 'my_activation');

少し詳しく見てみましょう。

<pre>	if ( !wp_next_scheduled( 'my_hourly_event' ) ) {

これは引数で指定したアクションがスケジュールにイベント設定されているかを判断しています。

試しに、以下の内容を見てみてください。

get_option( 'cron' );

現在設定されているスケジュールイベントの内容が表示されるかと思いますが、この中に該当のアクションが含まれているかどうかを判断しています。

wp_schedule_event( time(), 'hourly', 'my_hourly_event');

この関数が独自のアクションをスケジュールイベントに登録しています。

第一引数が実施日時のタイムスタンプ、第二引数が間隔、第三引数がアクション名です。
第一引数の時間はGMTで指定する必要があります。これは例えば、日本時間で深夜の時間を指定して処理をさせたいとかですと少し面倒ですね。
第二引数ではあらかじめ以下の値が、定義されています。
hourly,twicedaily,daily
(これは「cron_schedules」フィルターフックで追加・変更が可能です。)

これで毎時で独自の処理を行わせることができるようになりました。

がしかし、実際にその時刻になったからといって自動的に実行される訳ではありません。

実は、WordPressへのアクセスが必要です。

仕組みとしては、以下のようになっています。

WordPressへアクセスがあった場合、スケジュールイベントを確認して、実施日時が現在の時刻(これがGMTで処理されるために、登録時にGMTで指定する必要があったのです。)より過去に設定されていれば、そのスケジュールイベントに設定されているアクションを実行するためにwp-cron.phpというファイルを呼出します。

したがいまして、WordPressへのアクセスがなければまったく動作しないことになりますので、確実な実行が要求される場合には、他の手段を用いる必要がありますね。