WordPress の wp_cron についてのメモ書です。
WordPress では wp_cron と呼ばれる擬似 cron 機能がついていて、任意の処理を定期実行する仕組みがあります。
今回は、これを使って任意の処理を定期実行する方法をメモしておこうと思います。
スポンサーリンク
wp_cron に処理を追加するフック
テストとしてメールを送信する処理を wp_cron に登録してみます。
コードはこんな感じ。
if ( ! wp_next_scheduled( 'my_cron_event' ) ) { wp_schedule_event( time(), 'hourly', 'my_cron_event' ); } function my_cron_mail() { wp_mail( 'hoge@example.jp', 'テストメール', 'WordPress wp_cron のテスト。' ); } add_action( 'my_cron_event', 'my_cron_mail' );
登録は wp_schedule_event() を使って登録します。指定する引数はこんな具合です。
- $timestamp = 最初にイベントを発生する時刻を Unix タイムで指定。(必須)
- $recurrence = 実行間隔。hourly, twicedaily, daily のどれか。(必須)
- $hook = 実行するフック。(必須)
- $args = フックに渡す引数。(任意)
wp_next_scheduled() はその名前のフックが登録されているかを調べる関数で、返り値は登録されていれば「Unix タイムスタンプ」が、登録されていれば FALSE を返します。この場合は、定期処理の追加なので登録されていれば一度だけ wp_schedule_event() って感じですね。
そして、その下は実行する処理をフックとして登録となるようです。
今回は実験なので登録部分だけですが、他にも関連フックがいくつか存在します。
一回だけ実行は wp_schedule_single_event()、削除は wp_clear_scheduled_hook() を利用します。
wp_cron にスケジュールが登録されている場所
最後に wp_cron のタスクが登録されている場所についてですが、これはテーブル wp_options の cron に入っているようです。
mysql> SELECT * FROM wp_options WHERE option_name = 'cron'; +-----------+-------------+------------------------------+----------+ | option_id | option_name | option_value | autoload | +-----------+-------------+------------------------------+----------+ | 99 | cron | a:8:{i:1366094245; ~省略~ ;} | yes | +-----------+-------------+------------------------------+----------+
option_value はゴチャゴチャして目視し辛いのですが、上記の処理を wp_cron に登録すると下記のような値が追加されます。
i:1391076897;a:1:{s:12:"my_cron_event";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:6:"hourly";s:4:"args";a:0:{}s:8:"interval";i:3600;}}}
無事登録されているようです。
もっと簡単に確認するにはプラグインの「WP-Cron Dashboard」を使うのが良いです。
アクセスがない環境や、Basic 認証をかけている環境だと wp_cron が正常に動作しない場合もあるので注意。