Transients APIでWordPressのデータをキャッシュする方法を徹底解説!

みなさんこんにちは!エンジニアの高澤です!
今回はWordPressでデータをキャッシュする方法を徹底解説していきたいと思います。
WordPressのパフォーマンスを向上させるために欠かせない技術が「データのキャッシュ」です。キャッシュを活用することで、ページの読み込み速度を劇的に改善し、ユーザー体験を向上させることができます。
この「データのキャッシュ」を実現してくれるAPIの一つが「Transients API」です。
当記事では、WordPressの「Transients API」を使用したデータキャッシュの実装方法を徹底解説します。
テーマ開発やプラグイン開発においても必要になる場面があるため、よろしければぜひ当記事をお仕事などでご活用いただけましたら幸いです。
目次
Transients APIとは
Transients APIとは、WordPressのデータを一時的に保存し、必要なタイミングで再利用できる仕組みのことをいいます。
このTransients APIを何かしらの処理に組み込んで実装することで、データベースやサーバーに余計な負荷をかけず、サイトのパフォーマンスを向上させるのに役立ちます。
ちなみに以下がWordPress公式のTransients APIに関するページになりますので、よろしければご確認ください。
Transients APIの仕組み
Transients APIは、特定のデータを「一時的に保存」し、設定した有効期限が切れると自動的に削除される仕組みです。これにより、サーバーリソースの無駄遣いを防ぎ、効率的なデータ管理が可能になります。
Transients APIのは、以下の3つの要素で構成されています。
キー(Key) | 保存するデータに割り当てられるユニークな名前。 |
データ(Value) | 保存する値。文字列、配列、オブジェクトなど、さまざまな形式のデータが使用可能。 |
有効期限(Expiration) | データがキャッシュとして保存される時間(秒単位)。期限切れ後は自動的に削除されます。 |
上記それぞれのデータ構成は、例えばデータを保存する関数であるset_transient()関数などで以下のように使用されます。
<?php
set_transient(キー(Key), データ(Value), 有効期限(Expiration));
set_transient()関数で保存したデータは、指定した有効期限の間だけ保持され、期限が切れると自動的に削除されます。保存したデータはデータベースの「wp_options」テーブル に保存されます。
以下のコードは、WordPressのTransients APIを使って、一時的なデータを保存し、効率よく再利用する方法のサンプルコードになります。
こちらをご確認いただくと、なんとなくキャッシュの処理の流れが掴めるかと思います。
<?php
// キャッシュキーの設定
$transient_key = 'my_custom_transient';
// 既存のキャッシュを取得
$cached_data = get_transient($transient_key);
if ($cached_data === false) {
// キャッシュがない場合、新しいデータを生成
$cached_data = 'これはキャッシュされたデータです!';
// データを 1時間 (3600秒) キャッシュ
set_transient($transient_key, $cached_data, 3600);
}
// キャッシュの内容を出力
echo $cached_data;
上記コードは、まず、$transient_key変数にキャッシュ用のキー(識別子)を設定し、get_transient()関数を使って保存されたデータを取得しています。
もしキャッシュが見つからなければ、新しく「これはキャッシュされたデータです!」という文字列データを作成し、set_transient()関数で「1時間(3600秒) 」キャッシュしています。
次回のアクセス時にはif文の中の処理がスルーされて、保存されたデータをそのまま利用できるので、処理を高速化できます。最後に、データを画面に表示しています。
キャッシュとは
キャッシュとは、コンピューターやアプリケーションが一時的にデータを保存する仕組みのことを言います。
このキャッシュは、データや処理結果を「一時的な保存領域」に記録し、次回以降のアクセス時にその記録を利用する仕組みとなっております。
これにより、処理速度を高速化したり、システムの負荷を軽減したりする役割を果たします。Webサイトやアプリケーションのパフォーマンスを向上させるために、キャッシュは不可欠な技術の一つとなります。
本来は、データの生成や取得には時間や計算コストがかかりますが、キャッシュを利用することでそのコストを削減できます。
つまりキャッシュを簡単に言うと、「よく使うデータを一時的に保存しておいて、次に同じデータが必要になったときに、すぐに使えるようにする仕組み」といえます。
ここでキャッシュが大活躍する具体例をお話ししておきます。
例えば、Webサイトを見るとき、実は以下のように裏側でたくさんの作業が行われています。
- あなたがWebサイトにアクセスすると、
- サーバーが「どのページを表示するか」を考え、
- 必要な情報をデータベースから探し出し、
- デザインや画像、テキストを組み合わせてページを作り、
- それをあなたのブラウザに送ります。
しかし、この一連の作業には時間がかかることがあります。特にアクセスが集中する人気サイトでは、サーバーが忙しくなり、ページが遅くなることもあります。
ここでキャッシュが登場!
キャッシュを使うと、1回作ったページやデータを保存しておき、次に同じページにアクセスしたときは保存したものをそのまま渡すだけで済むため、作業が早く終わります。
キャッシュの種類
キャッシュにはいくつか種類があります。主なものでは以下があります。
- ブラウザキャッシュ(ユーザー側で保存・利用)
- サーバーキャッシュ(サーバー側で保存・利用、Transients APIが該当)
- CDNキャッシュ(エッジサーバーで保存・配信)
それぞれ解説いたします。
ちなみにTransients APIは、サーバーキャッシュです。
ブラウザキャッシュ
ブラウザキャッシュとは、ユーザーの端末に保存されるキャッシュの一種で、主に画像、CSS、JavaScriptなどの静的なリソースを一時保存する仕組みのことを言います。
一度ダウンロードしたデータをブラウザがローカルに保存しておき、次回同じページにアクセスした際に保存済みデータを再利用します。これにより、サーバーへのリクエスト回数や通信量が減り、ページの表示速度が向上します。
例えば、ロゴや背景画像など頻繁に変わらない要素はキャッシュされ、次回以降のアクセス時に即座に表示されます。ブラウザキャッシュの動作は、サーバーから送られるHTTPヘッダー(例: Cache-Control や Expires)で制御されます。
これにより、不要なリソースの再取得を防ぎ、ユーザー体験を向上させる重要な役割を果たします。
サーバーキャッシュ
サーバーキャッシュとは、サーバー側で動作するキャッシュ機能であり、動的な処理結果や生成されたデータを保存する仕組みのことを言います。
サーバーが一度生成したページやデータをキャッシュとして保存し、次回同じリクエストが来た際には、その保存されたデータを再利用します。これにより、データベースクエリや複雑な処理を繰り返す必要がなくなり、サーバー負荷を軽減しながら応答速度を向上させます。
WordPressでは、サーバーキャッシュを利用することで、動的に生成されるHTMLページを静的ファイルとして保存することが一般的です。これを実現するのに、一般的には「WP Super Cache」や「W3 Total Cache」などのプラグインが利用しているユーザーが多くいます。
また、MemcachedやRedisを利用して、データベースクエリ結果をObject Cache(オブジェクトキャッシュ)として保存するケースもあります。
CDNキャッシュ
CDNキャッシュとは、CDN(Content Delivery Network)の仕組みを活用したキャッシュのことを言います。
CDNは、世界中に分散されたエッジサーバー(ユーザーに近い場所に配置され、コンテンツやキャッシュを配信するためのサーバーで、通信遅延を最小化して高速なデータ提供を実現するサーバー)を通じて、ユーザーに最も近いサーバーからコンテンツを提供します。
このとき、静的ファイル(画像、CSS、JavaScript、動画など)や生成されたHTMLをキャッシュとして保存し、繰り返し利用します。これにより、地理的な距離やネットワーク遅延の影響を最小限に抑え、高速で安定したコンテンツ配信が可能になります。
例えば、大規模なWebサイトやECサイトでは、ユーザーがどの地域からアクセスしても同じ品質でページが表示されるよう、CloudflareやAWS CloudFrontなどのCDNサービスを利用しています。
CDNキャッシュは、サーバー負荷を大幅に軽減しながら、グローバルなスピードアップを実現する重要な技術です。
Transients APIが使われる場面
Transients APIはとにかくキャッシュ機能を提供してくれるんや!と言った具合にわかってきたところで、実際によく使われる場面についてイメージしておきましょう。
Transients APIは、以下のような場面で活用されることがしばしばあります。
使われる場面 | 内容 | 具体例 |
---|---|---|
外部APIのデータ取得 | 外部APIからのデータ取得はネットワーク遅延やAPI制限があるため、キャッシュしてリクエスト回数を削減します。 | 天気予報データや為替情報の表示。 |
高コストなデータベースクエリの結果保存 | 複雑なSQLクエリや大量のデータを扱う場合、計算結果を一時的にキャッシュすることでパフォーマンスを向上させます。 | 大規模な商品リストや統計情報のキャッシュ。 |
動的コンテンツのキャッシュ | ページ内の動的要素のデータを定期的に更新しながらキャッシュすることで、サイト全体の負荷を軽減します。 | WordPressの新着記事一覧、人気記事一覧の表示など。 |
他にもまだまだ活躍する場面はありますが、ざっとこのような感じをイメージしていただければと思います。
また、AWSなどでWordPressを立ち上げるなどがあるかと思いますが、AWSなどのクラウドサーバーの場合、リクエスト(ページアクセス)されるたびに従量課金なので、アクセス量によってその分お金がかかってしまいます。
また、Amazonや楽天などでアフィリエイトをする場合、その各サービスが提供するAPIを利用して商品画像や商品名、価格などのデータを取得してページ上に表示するなどといった施作や実装することがありますが、リクエスト周りの関係でデメリットを被ってしまうことがあります。
まさにそんな時に、このキャッシュ機能を実装できるTransients APIは大活躍しますし、しばしば利用されています。(無料テーマであるCocoonのAmazonや楽天などのアフィリエイト動線のショートコードなどがいい例ではないでしょうか)
Transients APIの使い方
それでは早速、Transients APIの使い方について解説していきたいと思います。
Transients APIには以下の内容で操作が可能です。
- データを保存する(set_transient()関数)
- データを取得する(get_transient()関数)
- データを削除する(delete_transient()関数)
それぞれ解説いたします。
データを保存する(set_transient()関数)
set_transient()関数は、指定したデータを一定時間キャッシュとして保存する関数です。
このset_transient()関数では、文字列・数値・配列・オブジェクトなど、ほぼあらゆる種類のデータを保存可能です。
保存したデータは、設定した有効期限が切れると自動的に削除されます。
set_transient()関数を記述するときは以下のように記述します。
<?php
set_transient($transient, $value, $expiration);
以下がset_transient()関数の引数の内容になります。
引数名 | 説明 | 例 |
---|---|---|
$transient | キャッシュキー(識別名) | ‘my_cache_key’ |
$value | 保存するデータ(文字列、配列、オブジェクト) | ‘キャッシュデータ’ |
$expiration | 有効期限(秒単位) | 60 * 60(1時間) |
例えば、以下のコードでは「キャッシュキー」という名前で 1時間(3600秒) データを保存しています。
<?php
set_transient( 'キャッシュキー', 'キャッシュデータ', 60 * 60 ); // 保存時間は1時間(3600秒)
ちなみにset_transient()関数は以下の注意点があります。
- シリアライズ不要
- 大きすぎるデータは非推奨
- 期限切れ後は自動削除
set_transient()関数は、配列やオブジェクトを自動的にシリアライズして保存し、get_transient()関数で復元できるため、開発者が手動でシリアライズする必要はありません。
ただし、「wp_options」テーブルに保存されるため、大きすぎるデータを扱うとパフォーマンスに影響を与える可能性があり、適切なデータサイズを意識することが重要です。
また、設定した有効期限が切れるとデータは自動的に削除されるため、永続的なデータ保存には適さず、一時的なキャッシュ用途として利用するのが望ましいでしょう。
以下が公式ドキュメントページになりますので、よろしければご確認ください。
データを取得する(get_transient()関数)
get_transient()関数は、保存したキャッシュデータを取得する関数です。
もしキャッシュが存在しない場合(期限切れや未保存)falseを返します。そのため、falseをチェックすることで、キャッシュがあるかどうかを確認できます。
get_transient()関数を記述するときは以下のように記述します。
<?php
get_transient($transient);
以下がget_transient()関数の引数の内容になります。
引数名 | 説明 | 例 |
---|---|---|
$transient | 取得するキャッシュキー | ‘my_cache_key’ |
例えば、以下のコードのように記述すれば、キャッシュがあればそれを利用し、なければ新しいデータを取得するという処理が可能になります。
<?php
$data = get_transient( 'キャッシュキー' );
if ( false !== $data ) {
echo 'キャッシュデータ: ' . $data;
} else {
echo 'キャッシュが存在しません。';
}
以下が公式ドキュメントページになりますので、よろしければご確認ください。
データを削除する(delete_transient()関数)
delete_transient()関数は、指定したキャッシュキーのデータを削除する関数です。
キャッシュをクリアする必要があるときに使用します。成功時はtrue、失敗時はfalseが戻り値になります。
キャッシュの削除は頻繁におこなうとキャッシュする意味がなくなってしまうので、あまり多用することにはならないかと思いますが、キャッシュを削除して画面を更新しなければならない場面で使用することになります。
delete_transient()関数を記述するときは以下のように記述します。
<?php
delete_transient($transient);
以下がdelete_transient()関数の引数の内容になります。
引数名 | 説明 | 例 |
---|---|---|
$transient | 削除するキャッシュキー | ‘my_cache_key’ |
以下が公式ドキュメントページになりますので、よろしければご確認ください。
それぞれ必ずおさえておくべき関数になりますので、ここでしっかり理解しておきましょう。
キャッシュを使う際の注意点
Transients APIを活用する際には注意点があります。
- 保存するデータサイズが大きすぎないようにする
- 保存期間を適切に設定する
- 重要なデータには使用しない(期限切れ時にデータが消えるため)
それぞれについて解説いたします。
保存するデータサイズが大きすぎないようにする
Transients APIを使用する際は、保存するデータのサイズが大きくなりすぎないように注意しましょう
データベースの「wp_options」テーブルやオブジェクトキャッシュに保存されるため、サイズが大きすぎるとクエリのパフォーマンスが低下し、サイトの速度が遅くなる可能性があります。
特に、大量の配列やオブジェクトをキャッシュする場合は、不要なデータを除外するなど工夫が必要です。
保存期間を適切に設定する
set_transient()関数の有効期限は、データの更新頻度に応じて適切に設定することが重要です。
例えば、1時間ごとに更新される情報なら3600 秒(1時間)に設定するのが理想的です。保存期間が長すぎると古いデータが表示され、短すぎると頻繁な再取得でサーバー負荷が増加します。
適切なバランスを考え、データの特性に合った期間を設定しましょう。
重要なデータには使用しない(期限切れ時にデータが消えるため)
Transients APIは 一時的なキャッシュを目的とした機能であり、有効期限が切れるとデータが自動的に削除されます。
そのため、サイト全体に影響する設定情報などの重要なデータには使用しないようにしましょう。重要な情報は「wp_options」テーブルやカスタムデータベーステーブルに保存し、Transients APIはパフォーマンス向上のためのキャッシュ用途に限定するのが適切です。
Transients APIでWordPressループする実装方法
それではTransients APIを使用した実装方法の一つとして、Transients APIでWordPressループする実装方法を解説いたします。
以下のコードが、キャッシュ機能を利用したWordPressループのサンプルコードになります。
こちらのコードを利用して、キャッシュ機能が搭載された新着記事一覧や関連記事一覧などを実装することが可能です。
<?php
// キャッシュキーの設定(キャッシュの識別名)
$transient_name = 'transient_post_list';
// キャッシュからデータを取得
$query = get_transient($transient_name);
if (empty($query)) { // キャッシュがない場合、新しくデータを取得
$args = array(
'post_type' => 'post', // 投稿タイプを指定(通常の投稿)
'posts_per_page' => -1, // すべての投稿を取得
'orderby' => 'date' // 投稿の日付順に並べる
);
// WP_Query を使って投稿データを取得
$query = new WP_Query($args);
// ログインユーザーにはキャッシュを適用しない(管理者向けに常に最新情報を表示するため)
if (!is_user_logged_in()) {
// 取得したデータを24時間(60秒 × 60分 × 24時間)キャッシュ
set_transient($transient_name, $query, 60 * 60 * 24);
}
}
// 取得した投稿データがある場合のみループを実行
if (!empty($query) && $query->have_posts()) :
while ($query->have_posts()) :
$query->the_post();
// ここに投稿の表示処理(タイトルや内容を出力など)
the_title('<h2>', '</h2>'); // 投稿タイトルを表示
endwhile;
// ループ後はデータをリセット
wp_reset_postdata();
endif;
上記コードについて解説いたします。
まず、get_transient()関数を使用して、キャッシュデータが存在するか確認します。
キャッシュがない場合は、新たに投稿データを取得する必要があります。そこで、WP_Queryを使い、すべての投稿を日付順に取得します。
次に、ログインユーザーにはキャッシュを適用しないようにしています。これは、管理者や編集者が常に最新の投稿データを確認できるようにするためです。
一方、ログインしていない一般ユーザーには set_transient()関数を使って取得したデータを24時間キャッシュし、サーバーの負荷を軽減します。
その後、if (!empty($query) && $query->have_posts())のif文の処理によって取得した投稿データが存在するかを確認し、存在する場合はwhileループ文で各投稿のタイトルを<h2>
タグで表示します。
最後に、wp_reset_postdata()関数を実行し、クエリをリセットして他のクエリに影響を与えないように処理を終了します。これにより、不要なデータベースクエリを減らし、サイトのパフォーマンスを向上させることができます。
Transients APIでのキャッシュをフックで削除
次は、キャッシュ削除の実装の一例として、Transients APIでのキャッシュをフックで削除する方法について解説いたします。
<?php
function clear_transient_cache() {
delete_transient('transient_post_list');
}
add_action( 'publish_post', 'clear_transient_cache');
add_action( 'deleted_post', 'clear_transient_cache');
add_action( 'save_post', 'clear_transient_cache');
add_action( 'edit_post', 'clear_transient_cache');
上記コードは、WordPressのアクションフックを利用して、投稿が追加・編集・削除された際にTransients APIで保存されたキャッシュを自動的に削除する仕組みを実装しています。
まず、clear_transient_cache()関数という独自の関数を定義し、その中で delete_transient(‘transient_post_list’)関数を実行するように記述しています。
このclear_transient_cache()関数は、以下のフックが発火したときにのキャッシュを削除する役割を持ちます。
- 投稿が公開されたとき(publish_post)
- 投稿が削除されたとき(deleted_post)
- 投稿が保存されたとき(save_post)
- 投稿が編集されたとき(edit_post)
上記のタイミングで clear_transient_cache()関数が実行され、キャッシュが削除されます。
これにより、投稿の内容が変更された際に、常に最新の情報が取得できる状態を維持できます。
ただ、一例としてあげておいてなんですが、頻繁に記事が更新される形で運用している場合、短いスパンでキャッシュが削除されるので、せっかくのキャッシュ機能の持ち味を活かせないコードになってしまいますので、その点にご注意ください。
キャッシュの削除の頻度には気をつけましょう
キャッシュは、データを一時的に保存することでサーバーの負荷を軽減し、表示速度を向上させる仕組みです。しかし、頻繁にキャッシュを削除しすぎると、そのメリットが失われてしまう可能性があります。
例えば、投稿の編集や保存のたびにキャッシュを削除すると、毎回新しいデータを取得し直すことになり、キャッシュの持ち味である「データの再利用」が機能しなくなります。その結果、データベースへのクエリが増加し、サーバーの負荷が高まるだけでなく、ページの表示速度も低下してしまうことがあります。
キャッシュの削除は、適切なタイミングで実施することが重要です。
例えば、管理画面内に「キャッシュを削除」のようなボタンを追加し、そのボタンをクリックしたときのみキャッシュを削除するようにすることで、パフォーマンスの向上も維持できるようになります。
キャッシュをおこなうコンテンツによりますが、1日に一回、一週間に1回、一月に一回、などのように、適切なタイミングを決めて削除するようにしましょう。
まとめ
WordPressでデータをキャッシュする方法についての解説は以上になります。
WordPressのパフォーマンスを向上させるために欠かせないのが「データのキャッシュ」です。キャッシュを活用することで、ページの読み込み速度を劇的に改善し、ユーザー体験を向上させることができます。
本記事では、WordPressの「Transients API」を使用したデータキャッシュの実装方法について詳しく解説しました。適切にキャッシュを活用することで、サーバー負荷を軽減し、効率的なデータ管理が可能になります。
ただし、キャッシュの削除頻度を適切に設定することが重要であり、削除しすぎると本来のメリットが失われる点にも注意が必要です。
テーマ開発やプラグイン開発の場面でも役立つ知識となるため、当記事をご活用いただき実際に開発しながら、最適なキャッシュ設計を目指してみてください。
お気軽に皆さんのご要望をお聞かせください!
どんなに些細なことでも構いません!よろしければ記事や当サイトへの「こんな記事があったら仕事とかで役に立つな〜」や「こうだったらもっと役に立つのに!」といったようなご要望等をお気軽にお聞かせください!今後のサービス改善にお役立てさせていただきます!
例1)Reactの技術記事を書いてほしい!
例2)WordPressの使い方とかを初心者向けに解説してほしい!...など