あなたは言う権利があります:
もう使用しquery_postsない
pre_get_posts
pre_get_postsクエリを変更するためのフィルターです。最もよく使用されるのは、「メインクエリ」のみを変更する場合です。
add_action('pre_get_posts','wpse50761_alter_query');
function wpse50761_alter_query($query){
if( $query->is_main_query() ){
//Do something to main query
}
}
(falseをis_admin()返すことも確認します-これは冗長かもしれません。)メインクエリは、テンプレートに次のように表示されます。
if( have_posts() ):
while( have_posts() ): the_post();
//The loop
endwhile;
endif;
このループを編集する必要があると感じた場合は、使用してくださいpre_get_posts。すなわち、使用したい場合query_posts()- pre_get_posts代わりに使用してください。
WP_Query
メインクエリはの重要なインスタンスですWP_Query object。WordPressはこれを使用して、たとえば、使用するテンプレートを決定し、URLに渡される引数(ページネーションなど)はすべて、WP_Queryオブジェクトのそのインスタンスに送られます。
二次ループ(サイドバーや「関連投稿」リストなど)の場合は、WP_Queryオブジェクトの独自の個別のインスタンスを作成する必要があります。例えば
$my_secondary_loop = new WP_Query(...);
if( $my_secondary_loop->have_posts() ):
while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
//The secondary loop
endwhile;
endif;
wp_reset_postdata();
注意wp_reset_postdata();-これは、セカンダリループが$post「現在の投稿」を識別するグローバル変数をオーバーライドするためです。これにより、基本的にリセット$postされます。
get_posts()
これは本質的に、WP_Queryオブジェクトの個別のインスタンスのラッパーです。これは、投稿オブジェクトの配列を返します。上記のループで使用されているメソッドは使用できなくなりました。これは「ループ」ではなく、単に投稿オブジェクトの配列です。
<ul>
<?php
global $post;
$args = array( 'numberposts' => 5, 'offset'=> 1, 'category' => 1 );
$myposts = get_posts( $args );
foreach( $myposts as $post ) : setup_postdata($post); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; wp_reset_postdata(); ?>
</ul>
あなたの質問に答えて
pre_get_postsメインクエリを変更するために使用します。WP_Queryテンプレートページのセカンダリループに別のオブジェクト(方法2)を使用します。
- メインループのクエリを変更する場合は、を使用します
pre_get_posts。