web-dev-qa-db-ja.com

トランジェントとCRON +のカスタムフィールド:投稿ごとのデータのキャッシュ

私が考え出そうとしている解決策についていくつかの意見を募集しました。

私はテレビ番組のファンのために私が取り組んでいるファン/愛好家のプラグインを持っています。プラグインに添付されているカスタム投稿タイプの1つは、番組のDVDリリースに関するデータを格納するリリースタイプです。私が保存したメタデータのいくつかは、彼らのProduct Advertising APIを使ったAmazonからの情報です。私はDVDの現在の価格のようなそこで利用可能な価格設定データのいくつかをキャッシュしたかったです。

私はトランジェントを使うことを考えていましたが、WPオプションの層以上のものは何も言えません。グローバルすぎる。特定の投稿を指すような命名規則を使用して、多数のトランジェントを作成する必要があります。

もう一つの選択肢はカスタムフィールドを使うがそれを更新するにはCRON APIを使うことです。私は1時間ごとに1つのCronジョブですべてのカスタムフィールドを更新するか、そうすることによって1つのcronジョブを作成します。

私の質問は、どのソリューションがより実用的なパフォーマンスと利便性のためになるだろうということですか?

1
Manny Fleurmond

私はカスタムフィールドの周りにラッパー関数を書くと思います。

function get_post_transient( $post_ID, $meta_key, $update_function ) {
    $current_value = get_post_meta( $post_ID, $meta_key, true );
    if ( is_array( $current_value ) && $current_value['expiration'] < date('U') )
        return $current_value['data'];

    $new_value = call_user_function( $update_function, $post_ID );
    update_post_meta( $post_ID, $meta_key, $new_value );

    return $new_value['data'];  

}

そして、次の形式の配列としてメタを保存します。

array(
    'expiration' => //timestamp that this field exires
    'data' => // all the custom data you want to save.
);

更新関数に同じ配列構造を返させるだけでいいのです。トランジェントを通じてオプションテーブルを使用することに比べてこのアプローチの本当の利点があるかどうかはわかりませんが、post metaテーブルにpost metaを格納することは私にとっては意味があります。

3
goldenapples

APIを使用してキャッシングを実装するときは、transientsルートを使用しました。主に、そのためにセットアップされていて使いやすいからです。テーブルのサイズやクエリに関して、それほど大きな問題はありません。 MySQLは大きなデータセット用に作られています。

私のアプローチは、APIに渡したURLや引数のハッシュを取得し、それを一時的な識別子として使用することでした。 APIとの通信を行う関数は、最初に一時的なものをチェックし、存在しないか期限切れになっていないかどうかを通常のAPI呼び出しで続行します。投稿メタで提案しているものよりも優れている点は、単一のテーブルとキーをチェックしているため、迅速であり、ループや複雑なコードが不要であり、APIは一時的な期限が切れたときにのみ呼び出されることですandデータが要求されたときに、API呼び出しの回数を減らす必要があります。

私のflickrプラグインとthemoviedb.orgプラグインの両方でうまく機能します。

2
sanchothefat

特定の投稿に関連している場合は、実際にはpostmetaにあるはずです。私はスピードと使いやすさの理由からこの原則に何度も違反しましたが、そのたびに汚く感じました。 :)

私が考える最良の方法は、代わりにpostmetaにデータと有効期限の両方を保存することでしょう。 1時間ごとにすべての種類を確認するのではなく、表示されているときだけ確認します。主な利点:あなたはこれを遅刻することができます!

例:

投稿ビューでは、メタはプルされています。期限切れのデータの場合は期限切れのデータが表示されますが、ページ表示の最後にそのデータを更新するようにコードの別の部分に指示する設定がグローバル変数のどこかに残されています。

それから、 "shutdown"アクションフックを使います。ここでは、そのグローバル変数を確認し、投稿のデータを更新する必要がある場合は、Amazonからデータを取得してpostmetaを更新し、有効期限をある程度の時間だけ増やします。

これは本当にすべての世界で最高のものです。投稿はまだ高速に表示され、視聴者は新しいデータがAmazonから送信されるのを待つ必要はありません。 Amazonデータは、ページが既に終了した後に更新されます。そして、あなたが見ているのはデータを爽快にすることだけです、そして彼らがそれらを見ているときだけ、処理を最小にします。

2
Otto