当サイト、Codex 日本語版は今後積極的な更新は行わない予定です。後継となる新ユーザーマニュアルは、https://ja.wordpress.org/support/ にあります。
万が一、当サイトで重大な問題を発見した際などは、フォーラムWordSlack #docs チャンネルでお知らせください。</p>

Transients API

提供: WordPress Codex 日本語版
2010年7月21日 (水) 12:41時点におけるTakahashi Fumiki (トーク | 投稿記録)による版 (2010年6月21日 (月) 00:09 Ramiy Transients_API)

(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

このページはWordPress Transients APIについての技術的な文書です。これはデータに名前と有効期限を設定して、データベース内に保存する標準的な方法です。〔訳注:一時的に保存されるべきデータを以下Transientと表記します〕

Transients APIはOptions APIに似ていますが、有効期限という機能を使うことで、wp_optionsテーブルをデータ保存用に使うことを可能にします。

また、Transient APIは本質的にキャッシングプラグインによってスピードアップされますが、Options APIはそうではないということも覚えておく必要があります。たとえば、memcacedプラグインはデータベース内ではなくメモリー内にTransientデータを保存します。こうした理由から、Transient APIは有効期限を持つデータのために使われるべきです。また、必ずデータベースに残っていると想定されるべきでもありません。そうではない場合もあるからです。

この記事が想定する読者はWordPressのテーマ作者、プラグイン作者、および特定のデータを指定した期限だけキャッシュしたいと考えている人です。この文書はPHPの基本的な理解を必要とします。

 // Transientデータをデータベースに保存
 set_transient($transient, $value, $expiration);
 
 // 保存されたTransientデータを取得
 get_transient($transient);
 
 // 保存されたTransientデータを削除
 delete_transient($transient);

Transientsデータの使用

Transientデータをコード内で使うのは、Options API: add_option() /en, add_site_option() /en, delete_option() /en, delete_site_option() /en, form_option() /en, get_site_option() /en, get_site_url(), get_user_option() /en, get_option() /en, update_option() /en, update_site_option() /en, update_user_option() /en, wp_load_alloptions() /en

ととても似ています。

set_transient()でTransientデータを保存する

Transientデータをデータベースに保存するには、set_transientを使います。

set_transient($transient, $value, $expiration);
  • $transient キャッシュデータの一意な識別子(ID)
  • $value 保存するデータ。通常の変数でも、配列/オブジェクトでもよい。APIは複雑なデータをシリアライズします。
  • $expiration データをリフレッシュするまでの有効期限を秒数で表したもの

例として、$special_query_resultsオブジェクトを12時間保存する方法を挙げます:

 set_transient('special_query_results', $special_query_results, 60*60*12); 

get_transient()でTransientデータを取得する

保存されたTransientデータをオプションのように取得します:

get_transient($transient);
  • $transient Transientを特定する識別子。set_transient()で指定したもの

上に挙げた$special_query_resultsの場合では、

 get_transient('special_query_results');

もしTransientデータがすでに存在しないか、有効期限切れの場合、get_transientはfalseを返します。このチェックには通常の等価演算子==ではなく、厳密な等価演算子===を使うべきです。整数0(または"empty"の配列)を保存したい場合もあるからです。こうした仕組みで返り値falseが想定されるため、Transientデータは単一の真偽値であってはなりません。配列に格納するか、整数に変換しましょう。

利用例:

 if (false === ($value = get_transient('value'))) {
      // Transientが存在しない場合、この部分のコードが実行されます。
      $value = // ここでTransientの値を設定し直します
 }
 // $valueに対して処理を行います

上記のコードはTransientを取得し、$valueに格納しています。ifブロック内のコードは取得するデータがないかどうかを確認するだけです。

delete_transient()でTransientsデータを削除する

Transientデータは最後にset_transient()関数を実行してから指定した秒数$expirationが経過すると自動的に消滅します。しかし、手動で強制的に削除することもできます。これは指定した動作(投稿の保存、カテゴリーの追加)などに応じてTransientデータをアップデートするのに役立ちます。

delete_transient($transient);
  • $transient set_transient()で指定されたTransientデータの識別子

上の例ではこのようになります:

delete_transient('special_query_results');

完全な例

上記の関数をすべて利用して、Transientデータを利用する例をお見せしましょう。

<?php
 // Transientデータを取得する
 if (false === ( $special_query_results = get_transient('special_query_results') ) ) {
     // Transientデータがなかったら、データを生成して保存する
      $special_query_results = new WP_Query('cat=5&order=random&tag=tech&post_meta_key=thumbnail');
      set_transient('special_query_results', $special_query_results);
 }
 
 // $special_query_resultsを使います
?>

delete_transient()を使った例も紹介します。この場合、edit_termアクションに関数を登録し、タグやカテゴリーが編集されたときに実行されるようにします(タームを編集することで保存したデータは無効になってしまうので、削除します)

 <?php
 // Transientデータを削除する関数を作成します
 function edit_term_delete_transient() {
      delete_transient('special_query_results');
 }
 // 関数をedit_termフックに登録し、カテゴリーやタグが編集されたときに実行されるようにします
 add_action('edit_term', 'edit_term_delete_transient');
 ?>

Transientを使うためにはプラグインやテーマに数行のコードを追加するだけですが、正しいシチュエーション(データベース負荷の高いデータや複雑な処理)で使えば、サイトのロード時間を節約することができます。