2026年8月10日
2026年8月10日
Object CacheとTransientsの違いと使い分け|WordPressのキャッシュAPIの選び方
WordPressには、プログラムの中で値を一時的に取っておくためのAPIが2つあります。wp_cache_set() などの Object Cache(オブジェクトキャッシュ) と、set_transient() などの Transients API(トランジェント) です。どちらも「一度計算した結果を取っておき、次は計算を省く」ためのものですが、保存先と消えるタイミングが違います。
この記事では、両者の違いと使い分けを、WordPressのソースコードと公式ドキュメント(2026年10月時点)に沿って説明します。
違いの早見表
| 項目 | Object Cache | Transients API |
|---|---|---|
| 主な関数 | wp_cache_get()・wp_cache_set()・wp_cache_delete() |
get_transient()・set_transient()・delete_transient() |
| 永続キャッシュが無いサイトでの保存先 | PHPのメモリーだけ。そのリクエストが終わると消える | データベースの wp_options テーブル |
| 永続キャッシュがあるサイトでの保存先 | RedisやMemcachedなど | Object Cacheと同じ所(データベースには書かない) |
| 期限 | 永続キャッシュがあれば指定できる(0 は期限なし) |
指定できる(0 は期限なし) |
| 期限前に消えることは | ある(メモリーが足りないときの追い出しなど) | ある(期限は「最長」の意味) |
| 向いている用途 | 同じリクエストで何度も使う値、永続キャッシュがある前提の値 | 外部APIの結果など、時間で持たせたい値。配布するプラグイン |
ここでいう「永続キャッシュ」は、wp-content/object-cache.php(ドロップイン)を置いてRedisやMemcachedに保存する仕組みです。Redis Object Cacheなどのプラグインがこのファイルを置きます。
Object Cacheの仕組み
WordPressのObject Cache(WP_Object_Cache クラス)は、標準では永続化されません。値はPHPのメモリーに置かれ、ページの表示(1回のリクエスト)が終わると消えます。それでも、WordPress本体は投稿・オプション・タームなどをここに入れており、同じリクエストの中で同じデータベース問い合わせを繰り返さずに済んでいます。
object-cache.php のドロップインを入れると、保存先がRedisやMemcachedに替わり、値がリクエストをまたいで残るようになります。WordPress本体のデータもすべてそこに載るので、データベースへの問い合わせが減ります。
主な関数は次のとおりです。
| 関数 | 働き |
|---|---|
wp_cache_get( $key, $group = '', $force = false, &$found = null ) |
値を取り出す。無ければ false。$found に、見つかったかどうかが入る |
wp_cache_set( $key, $data, $group = '', $expire = 0 ) |
値を保存する(あれば上書き) |
wp_cache_add( $key, $data, $group = '', $expire = 0 ) |
まだ無いときだけ保存する |
wp_cache_delete( $key, $group = '' ) |
値を消す |
wp_cache_get_multiple()・wp_cache_set_multiple() |
複数の値をまとめて取り出す・保存する |
wp_cache_flush_group( $group ) |
グループ単位で消す(WordPress 6.1以降。対応していない永続キャッシュもあるので wp_cache_supports( 'flush_group' ) で確認してから使う) |
$group(グループ)は、キーの名前空間です。自作のプラグインでは、プラグイン名などのグループを付けて、ほかのキーと重ならないようにします。
永続キャッシュが無いサイトでは、$expire は意味を持ちません(リクエストの終わりで消えるため)。
Transients APIの仕組み
Transients APIは、名前と期限を付けて値を保存するAPIです。
set_transient( 'myplugin_data', $data, 12 * HOUR_IN_SECONDS ); // 保存
$data = get_transient( 'myplugin_data' ); // 取り出し(無ければ false)
delete_transient( 'myplugin_data' ); // 削除
保存先は、永続キャッシュがあるかどうかで変わります。
- 永続キャッシュが無い場合:
wp_optionsテーブルに、値が_transient_名前、期限が_transient_timeout_名前という2つのオプションとして保存されます。期限なし(0)で保存したものは、すべてのページで最初に読み込まれる(autoload)設定になります。 - 永続キャッシュがある場合:
set_transient()は内部でwp_cache_set()を呼び、transientグループに保存します。データベースには書きません。
押さえておきたい点は次のとおりです。
- 期限は「最長」: 公式ドキュメントでは、期限は最大の保存時間で、それより前に消えることがあるとされています。永続キャッシュのメモリーが足りなくなったときなどです。消えていたら作り直すコードにします。
falseは保存しない:get_transient()は、無いときや期限切れのときにfalseを返します。falseそのものを保存すると区別できません。判定はfalse === $valueのように厳密に比べます。- 名前は172文字以内: オプション名の長さの上限から決まっています。
- 期限切れの掃除: 期限切れの値は、読み出されたときに削除されます。読み出されないまま残ったものは、1日1回のWP-Cronの処理(
delete_expired_transients)で削除されます。 - マルチサイト: ネットワーク全体で共有したい値には
set_site_transient()などを使います。
どちらを使うか
判断の目安は次のとおりです。
| こんな値 | 使うもの |
|---|---|
| 1回の表示の中で何度も使う計算結果 | Object Cache。永続キャッシュが無くても効く |
| 外部APIの応答など、数分〜数時間は使い回したい値 | Transients。永続キャッシュが無いサイトでもデータベースに残る |
| 配布するプラグイン・テーマで、時間で持たせたい値 | Transients。利用者のサイトに永続キャッシュがあるか分からないため |
| 自分で管理するサイトで、Redisなどの永続キャッシュがある前提の値 | Object Cache。グループ単位の削除など、細かい制御ができる |
| 消えると困る設定値やデータ | どちらも使わない。Options API(update_option())や投稿メタに保存する |
永続キャッシュがあるサイトでは、Transientsも結局Object Cacheに保存されます。そのため、「Object CacheとTransientsを組み合わせて二重に保存する」必要はありません。
コード例1: 外部APIの結果をTransientsで1時間保存する
<?php
/**
* 外部APIの結果を1時間保存する(Transients API)
*/
function myplugin_get_remote_data() {
$cache_key = 'myplugin_remote_data';
$data = get_transient( $cache_key );
if ( false !== $data ) {
return $data; // 保存済みの値を返す
}
$response = wp_remote_get( 'https://api.example.com/items', array( 'timeout' => 10 ) );
if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
// 失敗した結果は保存しない(次のアクセスで取り直す)
return array();
}
$data = json_decode( wp_remote_retrieve_body( $response ), true );
if ( ! is_array( $data ) ) {
return array();
}
set_transient( $cache_key, $data, HOUR_IN_SECONDS );
return $data;
}
https://api.example.com/items は例です。期限が切れた直後に多数のアクセスが重なると、それぞれが外部APIに問い合わせることがあります。アクセスの多いサイトでは、WP-Cronで定期的に取り直して保存する方法も検討します。
コード例2: 重い問い合わせの結果をObject Cacheに置く
<?php
/**
* 「おすすめ」に指定された記事のIDを5件取得する(Object Cache)
*/
function myplugin_get_featured_post_ids() {
// 記事や投稿メタが変わると値が変わる(WordPressが更新する)
$last_changed = wp_cache_get_last_changed( 'posts' );
$cache_key = 'featured_ids:' . $last_changed;
$found = false;
$ids = wp_cache_get( $cache_key, 'myplugin', false, $found );
if ( $found ) {
return $ids;
}
$query = new WP_Query(
array(
'post_type' => 'post',
'post_status' => 'publish',
'meta_key' => 'myplugin_featured',
'meta_value' => '1',
'posts_per_page' => 5,
'fields' => 'ids',
'no_found_rows' => true,
)
);
$ids = $query->posts;
// 永続オブジェクトキャッシュがあれば最大1日残る。無ければこのリクエストの間だけ
wp_cache_set( $cache_key, $ids, 'myplugin', DAY_IN_SECONDS );
return $ids;
}
wp_cache_get_last_changed( 'posts' ) は、記事や投稿メタが更新されるたびにWordPressが新しくする値です。これをキーに含めておくと、記事が変わったときに自動で別のキーになり、古い結果を使い続けることがありません。WordPress本体の WP_Query も同じ方法で問い合わせ結果をキャッシュしています。
$found を使うと、空の配列のように false と紛らわしい値を保存しても、「保存されていない」と区別できます。
WP-CLIで確かめる
# どの方式のObject Cacheが動いているか
wp cache type
# Transientsの保存先(データベースか、Object Cacheか)
wp transient type
# Transientsの値を見る・消す
wp transient get myplugin_remote_data
wp transient delete myplugin_remote_data
wp transient delete --expired
# Object Cacheをすべて消す
wp cache flush
永続キャッシュが無いサイトでは、wp cache get で値を見ることはできません。WP-CLIは別のリクエストとして動くため、ページの表示中にメモリーに置かれた値は残っていないからです。
wp cache flush は、永続キャッシュがあるサイトではRedisなどの中身をまとめて消します。同じRedisを複数のサイトで共有している場合は、ほかのサイトに影響しないか確かめてから実行します。
永続キャッシュを入れるには
「ツール」→「サイトヘルス」で永続オブジェクトキャッシュの利用が勧められている場合は、サーバーにRedisかMemcachedを用意し、ドロップインを入れます。Redisの場合の手順は、WordPressのオブジェクトキャッシュをRedisで高速化する方法で説明しています。Transientsが実際にRedisへ保存されているかの確かめ方は、WordPressのTransientsを永続オブジェクトキャッシュ(Redis等)に保存する設定と確認方法を参考にしてください。
共用のレンタルサーバーでは、Redisなどを利用者が用意できないことがあります。その場合は、Transientsでデータベースに保存する方法が使えます。
まとめ
- Object Cacheは標準ではリクエストの間だけの保存で、
object-cache.phpを入れるとRedisなどに永続化されます。 - Transientsは、永続キャッシュが無ければ
wp_optionsに、あればObject Cacheに保存されます。期限は最長の時間で、それより前に消えることがあります。 - 時間で持たせたい値や配布するコードではTransients、同じリクエスト内の使い回しや永続キャッシュ前提の細かい制御ではObject Cacheを使います。
- 消えると困るデータは、どちらにも頼らずOptions APIなどに保存します。