便利なワードプレスのCron自動処理機能「WP-Cron」の使い方
予約投稿機能などワードプレスのスケジュール機能を使ったことがあると思いますが、プラグインでもスケジュール機能を持たせることが可能です。
例えば、プラグイン「WP Evernote Synchronizer」で使用している定期的な自動処理を行ったり、予約投稿のように特定の日時にピンポイントで特定の処理をさせるなど、自分がワードプレスに直接アクセスして操作することなく処理することが出来ますので、処理を自動化させることができるんですよ。
Cronというサーバーの機能なんですが、ワードプレスにはこれを設定するためのコードが備わっているんです。今回はそれを可能にするワードプレスの「WP-Cron」機能の紹介です。用途によりますが、今回は僕が使用した定期的な自動処理方法を紹介します。
「Cron | Plugin Developer Handbook | WordPress Developer Resources」で方法は参照できますので、そのコードを使って解説していきます。
プラグイン「WP Evernote Synchronizer」の例
サンプルとして、実際どのような機能を自動処理しているかをプラグイン「WP Evernote Synchronizer」の機能と一緒に紹介します。
このプラグインはエバーノートのアカウントからノートを投稿タイプのページとしてワードプレスにインポートするプラグインです。
毎回ワードプレスを開いて手動でインポートするという方法も勿論可能ですが、エバーノート側でノートを追加・更新出来るので、自動で定期的にチェックして更新する方が、いちいちワードプレスをチェックする必要がありませんから便利なんですよ。
スケジュール処理の設定方法
スケジュール処理はコアによって行われるもの以外は、基本的にはプラグインに実装するものですので、そちらを想定した設定方法を紹介していきます。
テーマに実装することも出来るでしょうが、公式リポジトリにアップロードすることを考えているなら、一度それが可能かどうか確認した方がいいです。
基本的な手順は以下の通りです。
大まかな手順ですが、これだけで自動処理を設定することが出来ます。
インターバルとなる値を設定
自動処理を行う間隔はフィルターで設定します。
add_filter( 'cron_schedules', 'example_add_cron_interval' ); function example_add_cron_interval( $schedules ) { $schedules['five_seconds'] = array( 'interval' => 5, 'display' => esc_html__( 'Every Five Seconds' ), ); return $schedules; }
という形で、「cron_schedules」にフックさせることでインターバルの値を追加できます。「interval」の値は秒単位ですので、分や時間などを単位にして設定したい場合は、適切に乗算するのを忘れないように。
ワードプレスに標準的に備わっているのは以下の3つです。
- hourly
- twicedaily
- daily
これ以外は自分で追加する必要がありますから、例のようにインターバルの値を追加しておきましょう。
スケジュールフックを設置
次はスケジュールフックを用意します。
if( ! wp_next_scheduled( 'bl_cron_hook' ) ) { wp_schedule_event( time(), '5seconds', 'bl_cron_hook' ); }
僕はプラグイン「WP Evernote Synchronizer」では、同期用の関数を「wp」にフックさせていますが、別にフックさせなくても大丈夫な筈です。
このコードは「do_action」の自動処理バージョンといった感じですので、「add_action」で「bl_cron_hook」にフックさせることで自動処理できるようになるんですよ。
スケジュールフックに関数を設定
こちらは基本的なアクションフックの使用方法と同じ処理です。
add_action( 'bl_cron_hook', 'schedule_func' ); function schedule_func() { // 自動処理の内容 }
こんな感じです。
ここは特にこれ以上解説することは無い気がします。
スケジュール登録設定
プラグインを想定していますので、スケジュール処理を登録する為に、プラグインの有効化時にフックさせるのが良いと思われますので、こんな感じで書いておきます。
register_activation_hook( __FILE__, 'bl_activate' ); function bl_activate() { if( ! wp_next_scheduled( 'bl_cron_hook' ) ) { wp_schedule_event( time(), '5seconds', 'bl_cron_hook' ); } }
こうしておけば、プラグインを有効化した時に、自動処理のコードが読まれ、その次の5秒後の関数のコールが登録されます。
次からは「add_action」でフックしている関数が呼び出されますので、それ以降は自動処理が行われるようになります。
スケジュール解除設定
今度はプラグインを停止した時に呼び出される関数を用意します。
register_deactivation_hook( __FILE__, 'bl_deactivate' ); function bl_deactivate() { $timestamp = wp_next_scheduled( 'bl_cron_hook' ); wp_unschedule_event($timestamp, 'bl_cron_hook' ); }
関数「wp_unschedule_event」で次に呼び出される時間帯に登録されているスケジュール処理が解除されますので、停止した後はその関数が読まれなくなるんです。
これで自動処理の大まかな形は完了です。
さいごに
公式リポジトリには使えないと思いますが、テーマに実装する場合はちゃんと最初の引き金になるトリガーと解除用のコードは変えておきましょう。