wordpressでcronイベントをスケジューリングする

以前の記事で日本語ドキュメント上で検索すると見つからなかったと記述していしまいましたが、英語ドキュメントで cron として検索してみたところ下記のドキュメントを発見しました。当たり前ですがちゃんとあるようです。プラグイン開発者向けのスケジューリングに関するドキュメントのようですね。

Scheduling WP Cron Events

ちょっと目を通してみます。

タスクをスケジューリングする

下記にスケジューリングする際の事項の記載をまとめます

  • とりあえずタスクをスケジューリングするためにはカスタムフック及び、そのフックによって呼び出される関数を登録する必要がある
  • その実装は add_action(‘hook_name’, ‘function_name’) 関数を通して行われる
  • wp_schedule_event を通してフックの起動をスケジューリングできる、注意しないといけないのは wp_schedule_event を何度もコールすると、コールした回数だけスケジュールが重複して登録される
  • 重複チェックはユーザ側で実装する必要がある。 wp_next_scheduled(‘hook_name’) 関数をコールすると次のスケジュール timestamp が取得できる

これらを総合すると結果的には下記のようなスケジューリングの実装となるようです。

if ( ! wp_next_scheduled( 'hook_name' ) ) {
    wp_schedule_event( time(), 'five_seconds', 'hook_name' );
}

スケジューリングを削除する

下記にスケジューリングを解除する際の事項の記載をまとめます

  • wp_unschedule_event(timestamp, ‘hook_name’) 関数を通してスケジューリングの削除ができる
  • 直近のタスクだけでなく、それ以降の未来のスケジューリングに関しても削除してくれる
  • timestamp は普通はわからないので wp_next_scheduled 関数を利用して取得する

これらを統合すると結果的には下記のようなスケジューリング削除の実装となるようです。

$timestamp = wp_next_scheduled('hook_name');
wp_unschedule_event($timestamp, 'hook_name');

このスケジューリングの削除というのはプラグインが無効化された際などにしっかり行う必要があります。これはプラグイン開発者の責任です。
さもなければプラグインが無効化されたあともずーっと実行されてしまう可能性があります。

register_deactivation_hook 関数を利用することでユーザがプラグインを無効化したことをフックできます。
これらを鑑みると結果下記のようなコードが実装されることが好ましいです。

register_deactivation_hook( __FILE__, 'deactivate_function' );

function deactivate_function() {
   $timestamp = wp_next_scheduled( 'hook_name' );
   wp_unschedule_event( $timestamp, 'hook_name' );
}

まとめ

wordpress 上でのスケジューリングについて確認してみました。
このドキュメント前後に
Understanding WP-Cron Scheduling とか Hooking WP-Cron Into the System Task Scheduler とか読んだほうが良さげなものが出てきているので今後確認していきたいと思います。

またプラグイン無効化時にわざわざ解除処理を実装するということは、おそらくですがスケジューリング情報というのはリクエスト毎に初期化設定されるのではなく、どこかのストレージ(おそらくDBでしょうが)にステートとしてフック一覧を所持していると思われます。
この点についても今後確認していきたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください