WordPressには、時間を指定して自動的に関数を実行する「擬似Cron機能」が備わっています。
その中心となる関数が wp_schedule_event()
です。
本記事では、wp_schedule_event()
の基本的な使い方から、よくある注意点までを解説します。
目次
WordPressにおけるCronの仕組み
WordPressのCronは、実際のシステムCronではなく「疑似Cron」として動作します。
これは、サイトへのアクセスがトリガーとなって時間指定の処理を実行するという仕組みです。つまり、アクセスがなければ実行されません。
wp_schedule_event() の基本構文
wp_schedule_event( int $timestamp, string $recurrence, string $hook, array $args = array() );
$timestamp
:初回の実行時刻(Unixタイムスタンプ)$recurrence
:繰り返しの間隔(例:hourly
,daily
,twicedaily
)$hook
:実行したいアクションフック名$args
:アクション関数に渡す引数(省略可)
使用例:毎日AM3:00にカスタム関数を実行
まずはスケジュールイベントを登録します。
function my_schedule_cron() {
if ( ! wp_next_scheduled( 'my_daily_event' ) ) {
wp_schedule_event( strtotime( '03:00:00' ), 'daily', 'my_daily_event' );
}
}
add_action( 'wp', 'my_schedule_cron' );
次に、アクションフックに対応する関数を定義します。
function my_daily_function() {
// ここに定期的に実行したい処理を記述
error_log( '毎日3時に実行されました!' );
}
add_action( 'my_daily_event', 'my_daily_function' );
イベントの解除
プラグインの無効化などに伴って、スケジュールイベントを解除したいときは以下のようにします。
function my_unschedule_event() {
$timestamp = wp_next_scheduled( 'my_daily_event' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'my_daily_event' );
}
}
register_deactivation_hook( __FILE__, 'my_unschedule_event' );
カスタム間隔の追加
WordPressのデフォルト間隔(hourly
, twicedaily
, daily
)以外の間隔を使いたい場合は、cron_schedules
フィルターを使って独自に追加できます。
function my_custom_cron_schedules( $schedules ) {
$schedules['every_five_minutes'] = array(
'interval' => 300,
'display' => 'Every 5 Minutes',
);
return $schedules;
}
add_filter( 'cron_schedules', 'my_custom_cron_schedules' );
このように定義すれば、wp_schedule_event()
の第2引数に every_five_minutes
を使えるようになります。
wp_cron の実行タイミングに注意
WordPressのCronは、誰かがサイトにアクセスしたときに初めて実行されるため、アクセスのない時間帯は予定通りに処理が行われない可能性があります。
アクセスがない場合にも確実に処理を走らせたい場合は、サーバーのCron機能で以下のように wp-cron.php
を定期実行することが推奨されます。
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
テスト・デバッグに便利なプラグイン
開発中は以下のようなプラグインを使うと便利です。
- WP Crontrol:現在登録されているCronイベントの一覧や編集が可能
まとめ
wp_schedule_event()
を使えば、バックアップ処理、レポート生成、メール配信など、様々な定期処理をWordPress上で自動化できます。
ただし、WordPressのCronはアクセスベースであることを理解し、場合によってはサーバーCronとの併用を検討するとよいでしょう。