• 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細

このWikiはいつでも誰でも編集できます

Transients API

提供: WordPress Codex 日本語版
2015年7月28日 (火) 17:11時点におけるMiccweb (トーク | 投稿記録)による版 (Using Time Constants)

移動先: 案内検索

ページ名検討中: このページ名「Transients API」について改名が提案されています。ご意見をお寄せください。

このページ「Transients API」は未翻訳です。和訳や日本語情報を加筆してくださる協力者を求めています

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

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

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

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

Set/Get Transient
Delete Transient


 // 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 /enを使います。

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); 

時間の定数を使う

WordPress 3.5では、簡単に時間を表現するために、いくつかの定数が導入されました。

MINUTE_IN_SECONDS  = 60 (seconds)
HOUR_IN_SECONDS    = 60 * MINUTE_IN_SECONDS
DAY_IN_SECONDS     = 24 * HOUR_IN_SECONDS
WEEK_IN_SECONDS    = 7 * DAY_IN_SECONDS
YEAR_IN_SECONDS    = 365 * DAY_IN_SECONDS

したがって、たとえば、上記のコードサンプルは次のように単純化することができます:

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

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');
 ?>

Use transients with WP_Query to retrieve "featured posts":

<?php 
// Check for transient. If none, then execute WP_Query
if ( false === ( $featured = get_transient( 'foo_featured_posts' ) ) ) {
	
      $featured = new WP_Query(
	   array(
		'category' => 'featured',
		'posts_per_page' => 5
	   ));

	// Put the results in a transient. Expire after 12 hours.
	set_transient( 'foo_featured_posts', $featured, 12 * HOUR_IN_SECONDS );
} ?>
 
// Run the loop as normal
<?php if ( $featured->have_posts() ) : ?>
  
   <?php while ( $featured->have_posts() ) : $featured->the_post(); ?>
          // featured posts found, do stuff
   <?php endwhile; ?>
   
   <?php else: ?>
         // no featured posts found
<?php endif; ?>

<?php wp_reset_postdata(); ?>

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

外部リソース

http://www.warna.info/archives/1681/ Simple Colors - WordPressのTransients APIを用いて表示の高速化を図る

最新英語版: WordPress Codex » Transients API最新版との差分