2026年5月20日

2026年5月20日

WordPressプラグインでトランジェントキャッシュを使う方法

はじめに

WordPressのTransients APIは外部API結果・重いクエリ結果を一定時間キャッシュする仕組みです。set_transient() でデータを保存し get_transient() で取得することで、データベースや外部APIへの不要なアクセスを減らしてサイトを高速化できます。

症状・原因

  • 外部APIを毎回呼び出してページが遅い
  • 重いDBクエリを繰り返し実行しているのを最適化したい
  • キャッシュの有効期限を設定したい
  • WP-CLIでキャッシュをクリアしたい

解決手順

ステップ1:基本的なトランジェントキャッシュを実装する

// 外部API結果をキャッシュする例
function myplugin_get_weather_data(string $city): array {
    $cache_key = 'myplugin_weather_' . sanitize_key($city);

    // キャッシュから取得を試みる
    $cached = get_transient($cache_key);
    if ($cached !== false) {
        return $cached;  // キャッシュヒット
    }

    // キャッシュがない場合は外部APIを呼び出す
    $response = wp_remote_get(
        'https://api.weather.example.com/v1/current?city=' . urlencode($city)
    );

    if (is_wp_error($response)) {
        return [];
    }

    $data = json_decode(wp_remote_retrieve_body($response), true) ?? [];

    // 1時間キャッシュ
    set_transient($cache_key, $data, HOUR_IN_SECONDS);

    return $data;
}

ステップ2:重いDBクエリをキャッシュする

// 集計クエリをキャッシュ
function myplugin_get_popular_posts(int $limit = 10): array {
    $cache_key = "myplugin_popular_posts_{$limit}";

    $posts = get_transient($cache_key);
    if ($posts !== false) {
        return $posts;
    }

    global $wpdb;
    $posts = $wpdb->get_results(
        $wpdb->prepare(
            "SELECT p.ID, p.post_title, pm.meta_value AS view_count
             FROM {$wpdb->posts} p
             JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
             WHERE p.post_status = 'publish'
               AND pm.meta_key = '_view_count'
             ORDER BY CAST(pm.meta_value AS UNSIGNED) DESC
             LIMIT %d",
            $limit
        ),
        ARRAY_A
    );

    // 6時間キャッシュ
    set_transient($cache_key, $posts, 6 * HOUR_IN_SECONDS);

    return $posts ?: [];
}

ステップ3:キャッシュを適切に無効化する

// 投稿が更新されたらキャッシュを削除
add_action('save_post', function(int $post_id): void {
    if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
        return;
    }
    // 関連するトランジェントを削除
    delete_transient('myplugin_popular_posts_10');
    delete_transient('myplugin_popular_posts_5');
});

// プレフィックスで一括削除(グループキャッシュ)
function myplugin_delete_all_transients(string $prefix): void {
    global $wpdb;
    $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM {$wpdb->options}
             WHERE option_name LIKE %s
                OR option_name LIKE %s",
            $wpdb->esc_like('_transient_' . $prefix) . '%',
            $wpdb->esc_like('_transient_timeout_' . $prefix) . '%'
        )
    );
}

// 使用例
myplugin_delete_all_transients('myplugin_weather_');

ステップ4:有効期限の定数を使う

// WordPress定数を活用
set_transient('my_key', $data, MINUTE_IN_SECONDS);     //  1分
set_transient('my_key', $data, HOUR_IN_SECONDS);        //  1時間
set_transient('my_key', $data, DAY_IN_SECONDS);         //  1日
set_transient('my_key', $data, WEEK_IN_SECONDS);        //  1週間
set_transient('my_key', $data, MONTH_IN_SECONDS);       //  30日
set_transient('my_key', $data, YEAR_IN_SECONDS);        //  1年
set_transient('my_key', $data, 0);                      //  期限なし(永続)

ステップ5:WP-CLIでトランジェントを管理する

# トランジェントの値を取得
wp transient get myplugin_weather_tokyo

# トランジェントを手動設定
wp transient set myplugin_test_key "テスト値" 3600

# トランジェントを削除
wp transient delete myplugin_weather_tokyo

# 期限切れのトランジェントをすべて削除
wp transient delete --expired

# すべてのトランジェントを削除(キャッシュ全クリア)
wp transient delete --all

# データベース内のトランジェント数を確認
wp eval "
global \$wpdb;
echo \$wpdb->get_var(
  \"SELECT COUNT(*) FROM {\$wpdb->options}
    WHERE option_name LIKE '_transient_%'\"
) . ' transients found';
"

ステップ6:オブジェクトキャッシュとの使い分け

// Memcached・Redisが使える場合はwp_cache_*を使う(リクエスト内キャッシュ)
function myplugin_get_data_with_object_cache(int $id): array {
    $cache_group = 'myplugin_data';
    $cached = wp_cache_get($id, $cache_group);

    if ($cached !== false) {
        return $cached;
    }

    $data = myplugin_fetch_from_db($id);
    wp_cache_set($id, $data, $cache_group, HOUR_IN_SECONDS);

    return $data;
}
// wp_cache_*: リクエスト内のみ(外部キャッシュサーバーがある場合は永続化)
// set_transient: DBに保存、複数リクエストにまたがって永続化

注意事項

  • トランジェントキーは172文字以内に制限してください(DBのoption_name列の長さ制限)
  • get_transient()false を返すのはキャッシュミスとキャッシュ値が false の両方です。false を有効な値として保存しないよう注意してください
  • Redis・Memcachedが有効な環境では set_transient もオブジェクトキャッシュを使います

まとめ

Transients APIは set_transient($key, $data, $expiry) でデータを保存し get_transient($key) で取得します。wp transient delete --expired でWP-CLIから期限切れキャッシュを定期的にクリアしてDBを最適化しましょう。

お気軽にご相談ください

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