WordPress Cron システムは、新しい予定タスクを追加するためにフックを使用します。
フックの追加
タスクを実行させるには、独自のカスタム・フックを作り、そのフックに実行する関数名を付ける必要があります。これはとても重要なステップです。これを忘れると、タスクは実行されません。
次の例ではフックを作成します。最初のパラメータは作成するフックの名前で、2番目は呼び出す関数の名前です。
add_action( 'bl_cron_hook', 'bl_cron_exec' );
bl_
の部分は「関数の接頭辞」であることを忘れないでください。なぜ接頭辞が重要なのかは、こちらを参照してください。
タスクのスケジューリング
重要なことは、WP-Cron は単純なタスク・スケジューラーであるということです。ご存じのように、タスクは、目的のタスクを実行する関数を呼び出すために作成されたフックによって追加されます。しかし、同じフック名であっても wp_schedule_event()
を複数回呼び出すと、イベントは複数回予定されます。あなたのコードが各ページのロード時にタスクを追加する場合、タスクは数千回予定されることになります。これはあなたが望むことではないでしょう。
WordPress は、特定のフックがすでに予定されているかどうかをチェックするために、wp_next_scheduled()
という便利な関数を提供しています。wp_next_scheduled()
は、1つのパラメータとして、フック名を受け取ります。次の実行のタイムスタンプを含む文字列か、タスクが予定されていないことを示す false を返します。次のように使います:
wp_next_scheduled( 'bl_cron_hook' );
定期的なタスクのスケジューリングは wp_schedule_event()
で行います。この関数は、必須パラメータ3つと、追加パラメータとして、wp-cron タスクを実行する関数に渡す配列を受け取ります。ここでは最初の3つのパラメータに焦点を当てます。パラメータは以下の通りです:
$timestamp
– このタスクが最初に実行される UNIX タイムスタンプ。$recurrence
– タスクが繰り返し実行されるインターバルの名前 (秒単位)。$hook
– 呼び出すカスタムフックの名前。
ここで作成した5秒のインターバルと、上で作成したフックを次のように使います:
wp_schedule_event( time(), 'five_seconds', 'bl_cron_hook' );
まず、タスクがすでに予定されていないことを確認する必要があります。そこで、スケジューリングコードを次のようにチェックで囲みます:
if ( ! wp_next_scheduled( 'bl_cron_hook' ) ) {
wp_schedule_event( time(), 'five_seconds', 'bl_cron_hook' );
}
タスクのスケジューリング解除
予定されているタスクが不要になったら、wp_unschedule_event()
でタスクをアンスケジュールできます。この関数は以下の2つのパラメータを受け取ります:
$timestamp
– タスクの次の実行のタイムスタンプ。$hook
– 呼び出されるカスタムフックの名前。
この関数は、タイムスタンプで示されたタスクのスケジュールを解除するだけでなく、将来発生するすべてのタスクのスケジュールを解除します。おそらく「次のタスクのタイムスタンプ」を知らないでしょうから、それを探してくれるもう一つの便利な関数 wp_next_scheduled()
があります。wp_next_scheduled()
は1つのパラメータを取ります:
$hook
– タスクを実行するために呼ばれるフックの名前。
これをすべてまとめると、コードは次のようになります:
$timestamp = wp_next_scheduled( 'bl_cron_hook' );
wp_unschedule_event( $timestamp, 'bl_cron_hook' );
不要になったタスクのスケジュールを解除することは非常に重要です。WordPress はタスクが使われなくなっても (またはプラグインが無効化または削除された後でも)、実行しようとし続けるからです。タスクのスケジュールを解除するために覚えておくべき重要な場所は、プラグインの無効化時です。
残念ながら、WordPress.org のプラグイン・ディレクトリには、後始末をしないプラグインがたくさんあります。そのようなプラグインを見つけたら、コードを更新するよう作者に知らせてください。WordPress は register_deactivation_hook()
という関数を提供しており、プラグインが無効化されたときに関数を実行できます。設定はとても簡単で、次のようになります:
register_deactivation_hook( __FILE__, 'bl_deactivate' );
function bl_deactivate() {
$timestamp = wp_next_scheduled( 'bl_cron_hook' );
wp_unschedule_event( $timestamp, 'bl_cron_hook' );
}