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で確実な定期実行を保証しましょう。

お気軽にご相談ください

お見積りへ お問い合わせへ