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を最適化しましょう。