フックの追加
タスクを実行するには、独自のカスタムフックを作成し、そのフックに実行する関数の名前を付ける必要があります。これは非常に重要なステップです。これを忘れると、タスクは決して実行されません。
次の例はフックを作成します。最初のパラメータは作成するフックの名前で、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タスクを実行する関数に渡すことができる配列という1つの追加パラメータを取ります。最初の3つのパラメータに焦点を当てます。パラメータは次のとおりです:
- 1.
$timestamp
– このタスクが最初に実行されるべきUNIXタイムスタンプ - 2.
$recurrence
– タスクが繰り返される間隔の名前(秒単位) - 3.
$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つのパラメータを取ります:
- 1.
$timestamp
– タスクの次の発生のタイムスタンプ - 2.
$hook
– 呼び出されるカスタムフックの名前
この関数は、タイムスタンプで示されたタスクをスケジュール解除するだけでなく、タスクの将来のすべての発生もスケジュール解除します。次のタスクのタイムスタンプをおそらく知らないため、別の便利な関数wp_next_scheduled()がそれを見つけてくれます。wp_next_scheduled()
は1つのパラメータ(私たちが気にするもの)を取ります:
- 1.
$hook
– タスクを実行するために呼び出されるフックの名前
すべてをまとめると、コードは次のようになります:
$timestamp = wp_next_scheduled( 'bl_cron_hook' );
wp_unschedule_event( $timestamp, 'bl_cron_hook' );
もはやタスクが必要ない場合は、タスクをスケジュール解除することが非常に重要です。なぜなら、WordPressはタスクがもはや使用されていない場合でも(またはプラグインが無効化または削除された後でも)、タスクを実行しようとし続けるからです。タスクをスケジュール解除することを忘れない重要な場所は、プラグインの無効化時です。
残念ながら、WordPress.orgプラグインディレクトリには、自分自身をクリーンアップしない多くのプラグインがあります。これらのプラグインの1つを見つけた場合は、著者にコードを更新するように知らせてください。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' );
}
アクティベーションとデアクティベーションのフックについての詳細はこちらで読むことができます。