概要
このページには、WordPress Transients APIの技術文書が含まれており、カスタム名と有効期限を指定することで、データベースにキャッシュデータを一時的に保存するためのシンプルで標準化された方法を提供します。
Transients APIは、Options APIと非常に似ていますが、有効期限の追加機能があり、wp_options
データベーステーブルを使用してキャッシュ情報を一時的に保存するプロセスを簡素化します。
「site_」関数は本質的に同じですが、WordPressのMultisiteを使用する場合はネットワーク全体で機能します。
また、Transientsはキャッシュプラグインによって本質的に高速化され、通常のOptionsはそうではありません。たとえば、memcachedプラグインは、WordPressがデータベースではなく高速メモリに一時的な値を保存するようにします。このため、Transientsは、期限切れが予想されるデータや、いつでも期限切れになる可能性のあるデータを保存するために使用されるべきです。また、Transientsはデータベースに存在するとは限らないため、常にデータベースに保存されていると仮定してはいけません。
さらに、Transientsは有効期限前に利用できない場合があります。キャッシュと同様に、Transientsが利用できない場合は、データを再生成するためのフォールバックメソッドをコードに含めるべきです。
Ryan McCueは、チケットで次のように説明しました:
誰もが一時的な有効期限の仕組みを誤解しているようですので、要点は次のとおりです:一時的な有効期限は最大時間です。最小年齢はありません。Transientsは、設定した1秒後に消えることもあれば、24時間後に消えることもありますが、有効期限を過ぎると決して存在しません。
この文書の対象読者は、WordPressテーマの著者、プラグインの著者、および特定のデータをキャッシュする必要があるが、指定された時間内に更新したい人々です。この文書は、PHPスクリプトの基本的な理解を前提としています。
関数リファレンス
一時的なデータの設定/取得:
一時的なデータの削除:
Transientsの使用
Transientsの保存
一時的なデータを保存するには、set_transient()を使用します:
set_transient( $transient, $value, $expiration );
$transient
(文字列): 一時的な名前。
SQLエスケープされないことが期待されます。長さは172文字以下でなければなりません。$value
(配列|オブジェクト): 保存するデータ、通常の変数または配列/オブジェクト。
APIは複雑なデータのシリアル化を自動的に処理します。$expiration
(整数): データを更新する前に保持する最大秒数。
Transientsは、$expiration
の前に期限切れになる可能性があります(外部オブジェクトキャッシュやデータベースのアップグレードのため)が、$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
MONTH_IN_SECONDS = 30 * DAY_IN_SECONDS
YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS
たとえば、上記のコードサンプルは次のように簡略化できます:
set_transient( 'special_query_results', $special_query_results, 12 * HOUR_IN_SECONDS );
Transientsの取得
保存された一時的なデータを取得するには、get_transient()を使用します:
get_transient( $transient );
私たちの場合、特別なクエリ結果を取得するには次のようにします:
``````bash
get_transient( 'special_query_results' );
`
一時的なデータが存在しない場合、または期限切れの場合、get_transient()
はfalse
を返します。これは、整数値のゼロ(または他の「空」/「偽」データ)が保存したいデータである可能性があるため、通常の等価演算子==
ではなく、同一演算子===
を使用して確認する必要があります。この「偽」の値のため、Transientsは単純なブール値(true/false)を保持するために使用すべきではありません。代わりに配列に入れるか、整数に変換してください。
使用例:
if ( false === ( $value = get_transient( 'value' ) ) ) {
// this code runs when there is no valid transient set
}
上記のコードは、一時的なデータを取得して$value
に格納します。ifブロック内のコードは、取得する有効な一時的データがない場合にのみ実行されます。これは通常、他の手段で一時的な値を再生成する方法です。一時的なデータが通常の有効期限前に利用できない可能性があることを考慮してください。
保存されたTransientsの削除
一時的なデータは、最後にset_transient()を実行してから$expiration秒が経過すると自然に消えますが、手動で削除することで早期に消すこともできます。これは、特定のアクティビティ(投稿の保存、カテゴリの追加など)がキャッシュデータを本質的に古くし、更新が必要になる場合に便利です。
delete_transient( $transient );
私たちの場合、明らかにこれは次のようになります:
``````bash
delete_transient( 'special_query_results' );
`
WordPressは期限切れのTransientsをあまり頻繁にクリーンアップしません。期限切れのTransientsがデータベースに蓄積されるのを防ぐために、使用が終わったら常に一時的なデータを削除することが良い習慣です。
完全な例
ここで、コード内でTransientsを使用する方法の例を示します。
<?php
// Get any existing copy of our transient data
if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) {
// It wasn't there, so regenerate the data and save the 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, 12 * HOUR_IN_SECONDS );
}
// Use the data like you would have normally...
?>
delete_transient()を使用する例です。この場合、edit_term
アクションに関数を追加し、カテゴリまたはタグが編集されるたびに実行されるようにします(つまり、用語の編集がデータを無効にし、キャッシュされたバージョンを削除したいと仮定しています)。
<?php
// Create a simple function to delete our transient
function edit_term_delete_transient() {
delete_transient( 'special_query_results' );
}
// Add the function to the edit_term hook so it runs when categories/tags are edited
add_action( 'edit_term', 'edit_term_delete_transient' );
?>
「特集投稿」を取得するためにWP_Queryと一緒にTransientsを使用します:
<?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(); ?>
プラグインやテーマでTransientsを使用するのは簡単で、数行のコードを追加するだけですが、適切な状況(長い/高価なデータベースクエリや複雑な処理データ)で使用すれば、サイトの読み込み時間を数秒短縮できます。