web-dev-qa-db-ja.com

1つのクエリで同じオブジェクトをテンプレート内の複数のウィジェットに渡す

私は現在、複数のクエリを実行せずに、テンプレート上の複数のウィジェットに単一のクエリを渡すことを検討しています。明らかな目標はスピードと効率です。

私はテンプレート内のウィジェットの異なるインスタンスと同じオブジェクトの特定の側面を提供するウィジェットがあります。ウィジェットインスタンスは必須ですが、オブジェクトインスタンスは変更しないでください。私のウィジェットで探すべきアクションとフィルタのテンプレートランにスウィートスポットはありますか?

例えば、私はobject->titleを私のウィジェットのページ上部に表示したいので、そのボックスをチェックしてその領域に表示するようにします。それからその領域に表示するためにobject->contentをチェックするウィジェットの別のインスタンスがあります。

ウィジェット内では非常に簡単ですが、同じオブジェクトに対して2つのクエリを実行しただけなので、ウィジェットは2つの異なるオブジェクトであるため、非常に非効率的です。

この状況でウィジェットが同じクエリを2回試行しないようにするにはどうすればよいですか? get_queried_objectはこれらのウィジェットインスタンスの両方に対してクエリを実行しますか?

2
Nathan Powell

どのような場合でも、 オブジェクトキャッシュAPI または トランジェントAPI を使用することをお勧めします。より良いあなたのニーズ。

オブジェクトキャッシュを使った非常に簡単な例:

// helper function
function get_my_object() {
    $object = wp_cache_get( 'my_object' );
    if ( false === $object ) {
        $args = array( .... );
        $object = new WP_Query( $args );
        wp_cache_set( 'my_object', $object );
    } 
    return $object;
}

class cyb_my_widget extends WP_Widget {

    function __construct() {
        // ...
    }

    function widget( $args, $instance ) {
        // ...
        $object = get_my_object();
    }

    function update( $new_instance, $old_instance ) {
        // ...
    }

    function form( $instance ) {
       // ...
    }
}
3
cybmeta

簡単な方法は、テンプレート内にグローバル変数または 一時的 (オブジェクトを複数のページで使用する場合)を生成してウィジェットを作成することです。それにアクセスしてください。

プログラム的により健全なアプローチはかなり手間がかかり、このようになります。

  1. クエリを実行してオブジェクトを返すウィジェットを作成します。通常、 WP_widget インスタンスは、初期化に親の コンストラクタ を使用します。ただし、WP_Widgetクラスを拡張するときは、追加のコンストラクタを含めることもできます。ここでは、ウィジェットのインスタンスであるあなたのオブジェクトに追加の引数を渡す可能性を生成します。
  2. あなたが定義する他のウィジェットはWP_Widgetの拡張としてではなく、あなたの親ウィジェットの拡張としてなので、それらは追加の引数を取ることができます。
  3. 親ウィジェットの中で the_widget を使って他のウィジェットを表示し、 オブジェクトを渡します

他にも方法があるはずですが、これは私が検討するコースです。注:私はこのようなことをする必要性を感じていないので、このアプローチは '現状のまま'提供されています。

0
cjbj