2026年5月20日
2026年5月20日
WordPressプラグインでWP Cronを使う方法
はじめに
WP Cronはページアクセス時にトリガーされるWordPress独自のスケジュール実行機能です。メール送信・キャッシュクリア・データ集計など定期処理をプラグインから実装できます。
症状・原因
- WordPressで定期的にバックグラウンド処理を実行したい
- WP Cronでカスタムスケジュールを登録したい
- cronジョブが実行されているか確認したい
- アクセスが少ないサイトでWP Cronが動かない
解決手順
ステップ1:cronイベントを登録する
// プラグインの有効化時にスケジュールを登録
register_activation_hook(__FILE__, 'myplugin_activate_cron');
register_deactivation_hook(__FILE__, 'myplugin_deactivate_cron');
function myplugin_activate_cron(): void {
if (!wp_next_scheduled('myplugin_daily_task')) {
wp_schedule_event(
strtotime('tomorrow 03:00:00'), // 翌日の午前3時から開始
'daily', // 間隔(daily/twicedaily/hourly)
'myplugin_daily_task' // フック名
);
}
}
function myplugin_deactivate_cron(): void {
$timestamp = wp_next_scheduled('myplugin_daily_task');
if ($timestamp) {
wp_unschedule_event($timestamp, 'myplugin_daily_task');
}
}
// 実際の処理を登録
add_action('myplugin_daily_task', 'myplugin_run_daily_task');
function myplugin_run_daily_task(): void {
// 定期処理の内容
$log = sprintf('[%s] Daily task executed', date('Y-m-d H:i:s'));
error_log($log);
// 例:古いログを削除
global $wpdb;
$wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->prefix}myplugin_logs WHERE created_at < %s",
date('Y-m-d', strtotime('-30 days'))
)
);
}
ステップ2:カスタムスケジュール間隔を追加する
// 5分・15分・週1回などのカスタム間隔を追加
add_filter('cron_schedules', function(array $schedules): array {
$schedules['every_5_minutes'] = [
'interval' => 5 * MINUTE_IN_SECONDS,
'display' => '5分ごと',
];
$schedules['every_15_minutes'] = [
'interval' => 15 * MINUTE_IN_SECONDS,
'display' => '15分ごと',
];
$schedules['weekly'] = [
'interval' => WEEK_IN_SECONDS,
'display' => '毎週',
];
return $schedules;
});
// カスタム間隔でスケジュール登録
if (!wp_next_scheduled('myplugin_5min_task')) {
wp_schedule_event(time(), 'every_5_minutes', 'myplugin_5min_task');
}
ステップ3:WP-CLIでcronジョブを管理する
# 登録されているcronイベントを一覧表示
wp cron event list --format=table
# 特定イベントの次回実行時刻を確認
wp cron event list --format=json | python -m json.tool | grep myplugin
# cronイベントを今すぐ手動実行
wp cron event run myplugin_daily_task
# cronイベントを削除
wp cron event delete myplugin_daily_task
# 新しいcronイベントを追加(テスト用)
wp cron event schedule myplugin_daily_task now daily
# 登録されているスケジュール(間隔)一覧
wp cron schedule list --format=table
# WP Cronが実際に動作しているか確認
wp cron test
ステップ4:WP Cronが動かない問題を解決する
// wp-config.php に追記してWP Cronを無効化し
// サーバーcronで代替する(推奨)
define('DISABLE_WP_CRON', true);
# サーバーcron(crontab)でWP Cronを呼び出す設定
# crontab -e で以下を追加:
*/5 * * * * wget -q -O /dev/null "https://example.com/wp-cron.php?doing_wp_cron" 2>&1
# または WP-CLIを使う方法(推奨):
*/5 * * * * /usr/local/bin/wp cron event run --due-now --path=/var/www/html --quiet
ステップ5:非同期処理でバックグラウンドジョブを実装する
// 即時にバックグラウンド処理を実行(ワンショット)
function myplugin_schedule_immediate_task(int $post_id): void {
wp_schedule_single_event(
time() + 5, // 5秒後に実行
'myplugin_process_post', // フック名
[$post_id] // 引数
);
}
add_action('myplugin_process_post', function(int $post_id): void {
// 重い処理(画像最適化・外部API呼び出しなど)
$result = myplugin_heavy_process($post_id);
update_post_meta($post_id, '_processed', $result ? 'yes' : 'no');
}, 10, 1);
// 使用例:投稿公開時にバックグラウンド処理を予約
add_action('publish_post', 'myplugin_schedule_immediate_task');
注意事項
- WP Cronはサイトへのアクセスがないと実行されません。アクセスの少ないサイトでは
DISABLE_WP_CRON+ サーバーcronの組み合わせを推奨します - プラグイン無効化時に
wp_unschedule_event()で必ずイベントを削除してください。残留するとゾンビイベントになります - 同じイベントを重複登録しないよう
wp_next_scheduled()で確認してから登録してください
まとめ
WP Cronは wp_schedule_event() でフックに紐付けた定期処理を実装できます。wp cron event list でWP-CLIから登録状況を確認し、本番サイトでは DISABLE_WP_CRON + サーバーcronで確実な定期実行を保証しましょう。