WordPressを高速化させる!Transients APIを活用したとっておきの方法

エリカ


WordPressを高速化させる!Transients APIを活用したとっておきの方法

こんにちは、エリカです。

WordPress で、ランキングや、バナー、おすすめ記事などのリストを表示できるようにカスタマイズされたことはありますか? フックを使ってクエリを直接変更する場合はもちろん、WordPress の各種関数を上手に用いたとしても、場合によっては、複数のクエリや特殊なループ処理が発生してしまうかもしれません。 リクエストのたびに、そのような処理が行われるするとサーバーへの負荷は少なくないでしょうし、表示は少しでも高速化したいですよね。

 

そこで「Transients API」です。こちらを利用すると、簡単なキャッシュ機構を利用することができます。任意の場所で利用でき、保存・読み込み・破棄が楽に実装できます。

▼目次

 

1. データをキャッシュする

まずはデータをキャッシュする API を見てみましょう。


set_transient( $transient, $value, $expiration );

 

$transient キャッシュのキーです。45 文字以下という制限があります。このキーを元にキャッシュデータを探すことになります。
$value キャッシュするデータです。配列やオブジェクトなども指定できます。複雑なデータについてはこの API がシリアライズします。
$expiration キャッシュを更新するまでの秒数です。この期間を過ぎたキャッシュは一切値を返さなくなります。

 

2. キャッシュされたデータ使う

次にキャッシュされたデータを利用する API を見てみましょう。


get_transient( $transient );

 

$transient – キャッシュしたときのキーです。

キャッシュされたデータが見つからなかった場合、更新期限を過ぎていた場合は、false が返ります。

 

3. キャッシュを消す

最後は、キャッシュを消す API です。


delete_transient( $transient );

 

$transient – キャッシュしたときのキーです。

該当するキャッシュデータを削除します。

以上が主な操作になりますが、非常に簡単でわかりやすいですね。

それでは、実際に使う場面のサンプルです。

 

4. キャッシュを扱うコードの例

例えば、下記のようなコードがあったとします。


function get_ranking() {

    // 頑張って書いたいろんな処理をするコード

    return $ranking;
}

$ranking = get_ranking();

foreach( $ranking as $post ) {
    // 色々表示
}

 

get_ranking 関数の中では、いろいろな処理やデータベース操作があるかもしれません。そこで、キャッシュがあればキャッシュを返すように変更します。

 


function get_ranking() {

    if ( false === ( $cache = get_transient( 'get_ranking_no_cache' ) ) ) {
        return $cache;
    }

    // 頑張って書いたいろんな処理をするコード

    set_transient( 'get_ranking_no_cache', $ranking, 3600 ); // 1時間経過したら更新されるように

    return $ranking;
}

$ranking = get_ranking();

foreach( $ranking as $post ) {
    // 色々表示
}

 

これでキャッシュがあればキャッシュを返すようになりました。もしも、 「頑張って書いたいろんな処理をするコード」が、複雑であればあるほど、キャッシュの恩恵を感じることができるようになるかと思います。

次は、実際にどのような処理が行われているかを見てみます。

 

5. どんな処理をしているの?

Transients API は基本的にはデータベースにキャッシュを保存します。これは wp_options テーブルへの読み書きをシンプルに行うことによって実現しています。

まず、set_transient() 実行時に、wp_options にレコードをふたつ追加します。ひとつは、実際のシリアライズしたデータ。もうひとつは、期限管理用のデータになります。

なので、get_transient() 実行時は、まずは対象の期限管理用のデータを探し、期限内であれば、実際のデータを返却します。なので最低ふたつのクエリが発行されることにはなりますが、複雑な処理が毎回行われることに比べれば、非常にシンプルにデータを取り回すことができるようになります。

なお、期限が切れていた場合は、それぞれのデータを削除し、おそらく再度キャッシュを作成することになります。したがって、そのタイミングではキャッシュを用いない場合より負荷が上がることにはなりますので、キャッシュの期限や取り扱うデータの量などとの関連性に基づいて、キャッシュを利用する箇所を決める必要があるかもしれません。

 

6. データの更新時にキャッシュを削除したい場合

更新したいタイミングのアクションフックで、delete_transient() を実行することで対応できます。

記事更新時に先ほどのデータのキャッシュを削除する場合は、下記のようになります。

add_action( 'save_post', function () {
delete_transient('get_ranking_no_cache');
} );

 

まとめ

基本的には、データベースを利用すると紹介しましたが、キャッシュプラグインなどを利用すると、キャッシュの保存先をメモリなどに変更し、さらに高速に動作させることもできます。

WordPress を動かす場合は、さまざまなタイプのキャッシュがあります。その中のひとつについてご紹介しました。

ただし、「キャッシュの期限が切れた」「破棄されてしまった」といった場合でも、常に意図したキャッシュデータが作成され、表示することができるような一時的なデータへの利用にとどめるようにしてください。

プラグインなどでは、非常に上手に Transient_API を利用してるものもありますので、いろいろ見てみると面白いですね。

 

エリカ
この記事を書いた人
エリカ

ディレクター

関連記事