定期的にバッチ処理などを実行したい場合は通常 cron を使用しますが、レンタルサーバなどで使用できないことがあったりするためにプラグインで cron を使用することができません。しかし WordPress には疑似 cron で定期的に処理を実行する方法があります。

Function Reference/wp schedule event ? WordPress Codex

Schedules a hook which will be executed by the WordPress actions core on a specific interval, specified by you. The action will trigger when someone visits your WordPress site, if the scheduled time has passed. See the Plugin API for a list of hooks.

WordPress へのアクセスをトリガーとして、その時に実行すべき処理が実行するべき時間を過ぎていれば実行されるという疑似 cron です。厳密に時間を指定することは(特にアクセスの少ないブログではなおさら)無理ですがざっくりとしたバッチ処理などはこれで実行させることができます。

WordPress 2.7 のインストール時にはプラグインのアップデートとテーマのアップデートが1日2回確認するように設定されていました。

wp_schedule_event で実行する処理と実行間隔を指定して、wp_clear_scheduled_hook で登録されている処理をキャンセルします。

wp_schedule_event(time(), ‘hourly’, ‘my_schedule_hook’);
第1引数は最初に実行する時間
第2引数は実行間隔
第3引数は実行する処理のフック名

実行間隔は、毎時 ‘hourly’、日に2回 ‘twicedaily’、毎日 ‘daily’ とあります。その他に自分で設定を増やすこともできます。

気をつけないと行けないのが wp_schedule_event で指定する第三引数は処理のフック名なので、add_action でこのフック名に実行するアクションを指定しないといけません。

実際の指定方法は以下のようになります。

add_action('my_cron', 'my_cron_do');

function my_activation() {
    wp_schedule_event(time(), 'hourly', 'my_cron');
}
register_activation_hook(__FILE__, 'my_activation');

function my_deactivate() {
    wp_clear_scheduled_hook('my_cron');
}
register_deactivation_hook(__FILE__, 'my_deactivate');

また、register_deactivation_hook でプラグインを無効にした時にスケジュールをクリアしておかないと無効にしたプラグインの処理が行われてしまいますので注意が必要です。

詳しくはソース wp-includes/cron.php を見るのが分かりやすいかと思います。

関連する投稿