WordPressで時間のかかる処理をキャッシュ機能を利用して高速化する方法

WordPressで時間のかかる処理を行うとき、ページ表示ごとに毎回処理を行っていては、毎回ページ表示が遅くなってしまいます。

そんな時は、Transients APIを利用することで、結果などをデータベースにキャッシュ化することである程度高速化を図ることができます。

スポンサーリンク
レクタングル(大)広告

Transients API の使い方

Transients APIを利用する簡単なサンプルは以下になります。

例えば以下のような関数をfunctions.phpに記入します。

//キャッシュがあるときはキャッシュから、ないときは処理を行って取得する関数
function get_transient_value(){
  //データベースキャッシュに値を取得
  $res = get_transient( 'transient_key' );

  if ( $res === false ) {//キャッシュが存在しないとき

    //ここにAPIから値を取得するような時間のかかる処理を書く
    //$res = fetch_sns_count();

    //取得した値をデータベースキャッシュに保存
    set_transient( 'transient_key',
                   $res,
                   60 * 60 * 24 //秒で指定(サンプルは一日)
    );
  }
  return $res;
}

あとは、キャッシュを呼び出したい場所で以下のように記入するだけです。

<?php echo get_transient_value(); ?>

保存したキャッシュを削除したい場合は、以下のようにdelete_transientを指定して削除することができます。

delete_transient( 'transient_key' );

transientの便利なところ

transientは、単に値や文字列だけではなく、配列やオブジェクトを、そのままシリアライズ化して保存しておくことができます。

例えば、サンプルとして以下のような配列をset_transientで保存したとしても、データベースにキャッシュされget_transientで手軽に取り出すことができます。

$res = array(
  '山田' => array(
      'ID' => '001',
      '出身' => '函館',
      'メールアドレス' => 'yamada@example.com',
      '性別' => '女性'
  ),
  '田中' => array(
      'ID' => '002',
      'メールアドレス' => 'tanaka@example.com',
      '性別'  => '男性'
  ),
  '高橋' => array(
      'ID' => '003',
      '出身' => '札幌',
      'メールアドレス' => 'takahasi@example.com',
      '性別'  => '女性',
  ),
);
set_transient( 'transient_key', $res,  60 * 60 * 24);

transientで保存したものは、Wordpressのデータベース上では、wp_optionsテーブルに保存され、以下のようにシリアライズ化されて保存されています。

transientでシリアライズ化された配列

もちろん、オブジェクトもそのまま保存できるので、時間のかかるDBクエリの結果をそのまま保存しておくなんてこともできます。

クエリ結果などを保存しておくことで、transientでクエリ数を削減し処理時間の短縮をはかるなんてこともできるかと思います。

クエリ結果を保存するサンプルについては以下を参照してください。

transientキャッシュの全削除

一応、データベース上のtransientキャッシュを全て削除する方法も以下に載せておきます。

//transientキャッシュの削除
function delete_all_transients(){
  global $wpdb;
  $wpdb->query("DELETE FROM `wp_options` WHERE (`option_name` LIKE '%_transient_%') OR (`option_name` LIKE '%_transient_timeout_%')");
}

キャッシュの全削除を行いたい場合は、上記の関数をどこかで呼び出してください。

上記コードだと、自分が設定したもの以外のもの(例えばプラグインが設定したもの)を含めて全てのtransientキャッシュがクリアされます。

特定のtransientキーを含んだキャッシュのみを削除する場合は、以下のように書いてください。

//transientキャッシュの削除
function delete_all_transients(){
  global $wpdb;
  $wpdb->query("DELETE FROM `wp_options` WHERE (`option_name` LIKE '%_transient_XXXXXXXXX%') OR (`option_name` LIKE '%_transient_timeout_XXXXXXXXX%')");
}

XXXXXXXXXの部分を任意のtransientキーを設定してください。

まとめ

このように、transientを利用することで、様々なものをデータベースに保存することができるので、手軽にキャッシュ化して利用することができます。

例えば、「ものすごく時間のかかるAPIからのSNSシェア数の取得」なんかを、キャッシュ化しておくと、1度取得してしまえば次回からは、ネットワークを利用しないので、高速化を図ることができるかと思います。

このtransient機能は、使い方次第でいろいろ便利に使えるかと思います。