私は現在、複数のクエリを実行せずに、テンプレート上の複数のウィジェットに単一のクエリを渡すことを検討しています。明らかな目標はスピードと効率です。
私はテンプレート内のウィジェットの異なるインスタンスと同じオブジェクトの特定の側面を提供するウィジェットがあります。ウィジェットインスタンスは必須ですが、オブジェクトインスタンスは変更しないでください。私のウィジェットで探すべきアクションとフィルタのテンプレートランにスウィートスポットはありますか?
例えば、私はobject->title
を私のウィジェットのページ上部に表示したいので、そのボックスをチェックしてその領域に表示するようにします。それからその領域に表示するためにobject->content
をチェックするウィジェットの別のインスタンスがあります。
ウィジェット内では非常に簡単ですが、同じオブジェクトに対して2つのクエリを実行しただけなので、ウィジェットは2つの異なるオブジェクトであるため、非常に非効率的です。
この状況でウィジェットが同じクエリを2回試行しないようにするにはどうすればよいですか? get_queried_object
はこれらのウィジェットインスタンスの両方に対してクエリを実行しますか?
どのような場合でも、 オブジェクトキャッシュ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 ) {
// ...
}
}
簡単な方法は、テンプレート内にグローバル変数または 一時的 (オブジェクトを複数のページで使用する場合)を生成してウィジェットを作成することです。それにアクセスしてください。
プログラム的により健全なアプローチはかなり手間がかかり、このようになります。
the_widget
を使って他のウィジェットを表示し、 オブジェクトを渡します 。他にも方法があるはずですが、これは私が検討するコースです。注:私はこのようなことをする必要性を感じていないので、このアプローチは '現状のまま'提供されています。