web-dev-qa-db-ja.com

WPクエリの一時キャッシュ

私はコーデックスの一時的なものといくつかの質問と答えをここで読みました。

だから私はWPに基づいてWebアプリを開発しています。それは今動作しますが、私はそれを最適化したいです。ユーザーはコンテンツの正規化を管理するため、不正操作は一般的です。このため、有効期限付きのページキャッシュは使用したくありません。

"get"操作にいくつかのキャッシュ機能を実装したいです。これは私の心の中にあります:

  1. ユーザーがコンテンツを追加し、リストを作成する
  2. 私はそのリストオブジェクトとアイテム自身のために一時的な "レコード"を作成します。
  3. リストが変更(更新、削除、作成)されたとき、前のキャッシュレコードを削除して新しいものを追加します

主に私はWP_Query(投稿とメタ)を使います。質問:

このキャッシュ方法が必要ですか、それともwp_queryで一時キャッシュを使用しても大きな効果はありませんか?

すべての結果を別のテーブルに入れるというもう1つの懸念は、少し無関係です...?!

2
Iamzozo

私のWordPressの紹介ウィジェットプラグインのために私は0.1から0.5秒でページロードを落とすために有効期限付きのトランジェントを首尾よく使用しました。

WordPress自身のトランジェントを使用することは命の恩人です。必要に応じてパッケージ化したり、そのまま使用したりしてから、アプリケーションロジックに再び集中することがはるかに簡単です。さらに別のキャッシングシステムをローリングするのは無駄です。さらに、W3 Total CacheやWP Super Cacheのようなキャッシングプラグインを使用するようになると、さらにスピードを上げるキャッシングの連携が追加されています。

現時点では、期限切れのトランジェントはwp_optionsテーブルを埋めます。 WordPressの将来のバージョンでは、一時的なクリーンアップの処理が改善される予定です。今のところ、 https://Gist.github.com/ScottPhillips/2907732 ]で定期的な一時的削除を確認するか、アプリケーションにロールインします。

私は無料でプレミアムなプラグインをしているので、キャッシュ操作を抽象化しましたが、私の抽象化を自分の仕事に移すことができなかった理由はありません。

あなたの場合は、ユーザーがデータを作成することについて話していますが、そのデータ作成がウィジェットであるか、または以下のtestimonialswidget_listとしてショートコードオプションが$attsに渡されると考えることができます。

$content = apply_filters( 'testimonials_widget_cache_get', false, $atts );は与えられた$attsのための現在のキャッシュエントリがあることをチェックしています。そのため、着信する$attsが変更されていると、キャッシュは失敗し、falseが返されて新しいデータセットが作成されます。

$content = apply_filters( 'testimonials_widget_cache_set', $content, $atts );は、新しく生成されたデータが素早く簡単に再利用できるようにキャッシュに保存される場所です。

testimonials-widget.php からデータを取得しています。

public function testimonialswidget_list( $atts ) {
    self::add_instance();

    $atts = wp_parse_args( $atts, self::get_defaults() );
    $atts = Testimonials_Widget_Settings::validate_settings( $atts );

    if ( get_query_var( 'paged' ) ) {
        $atts['paged'] = get_query_var( 'paged' );
    } elseif ( get_query_var( 'page' ) ) {
        $atts['paged'] = get_query_var( 'page' );
    } else {
        $atts['paged'] = 1;
    }

    $atts['type'] = 'testimonialswidget_list';

    $content = apply_filters( 'testimonials_widget_cache_get', false, $atts );

    if ( false === $content ) {
        $testimonials = self::get_testimonials( $atts );
        $content      = self::get_testimonials_html( $testimonials, $atts );
        $content      = apply_filters( 'testimonials_widget_cache_set', $content, $atts );
    }

    return $content;
}

キャッシュ操作

add_filter( 'testimonials_widget_cache_get', array( $this, 'cache_get' ) );
add_filter( 'testimonials_widget_cache_set', array( $this, 'cache_set' ), 10, 2 );
public static function cache_get( $args ) {
    $hash     = self::create_hash( $args );
    $do_cache = apply_filters( 'testimonials_widget_disable_cache', true );
    $no_cache = isset( $args['no_cache'] ) && Testimonials_Widget_Settings::is_true( $args['no_cache'] );
    if ( ! $do_cache || $no_cache ) {
        delete_transient( $hash );
        return false;
    }

    $data = get_transient( $hash );

    return $data;
}


public static function cache_set( $data, $args ) {
    $hash = self::create_hash( $args );
    set_transient( $hash, $data, self::$cache_period );

    return $data;
}

上記のコードはスクラップです。自分のアプリケーションにコピーして貼り付けるだけではうまくいきません。 self::Testimonials_Widget_Settings::があなたのニーズに合うようにコードを変更するための可能性のあるポイントとしてどこで使われているかを調べることをお勧めします。

2
Michael Cannon