web-dev-qa-db-ja.com

すべてのクエリで発生する "pre_get_posts"

メインクエリのみの引数を変更し、他のクエリには影響を与えないようにするにはどうすればよいですか。

add_filter('pre_get_posts', 'custom_post_count');
function custom_post_count($query){
  $query->set('posts_per_page', 5);
  return $query;
};

このアクションはWP_Queryのget_postsメソッド内で呼び出されるため、このコードではメインループだけでなく、すべてのループのposts_per_page引数が変更されるため、この引数を渡すとWP_Queryには意味がありません...

3
onetrickpony

基本的にあなたが探しているものはメインクエリの値に設定されるglobal $wp_the_query変数です。 100%のケースには完全に適合しないかもしれませんが、おそらく99%のケースでうまくいくでしょう:

add_action( 'pre_get_posts', 'custom_post_count' );
function custom_post_count( $query ){
  global $wp_the_query;
  if ( $wp_the_query === $query ) {
    $query->set( 'posts_per_page', 5 );
  }
  return $query;
};
7
MikeSchinkel

まず、 'pre_get_posts'はアクションであり、フィルタではありません。それが最初の主な問題です。次に、コンテキストに条件を設定する必要があります。

add_action('wp', 'custom_post_count');
function custom_post_count($query){
    if($query->is_home || $query->is_front_page){
        $query->set('posts_per_page', 5);
    }
    return $query;
};

前の例は、テンプレートファイルに手を加えることなく、これをfunctions.phpで一度使用したい場合です。すべてのクエリに影響を与える限り、新しいクエリを作成しない場合、すべてのループはpre_get_posts $クエリを継承します。そのため、次の例でquery_posts()を使用して新しいクエリを作成しています。

カスタムループ

これが私がカスタムループをする方法です:

$args = array(
    'posts_per_page' => 5
);
query_posts($args);

if(have_posts()): while(have_posts()): the_post();


endwhile; else:

endif;

wp_reset_query();

Query_posts()をループの上に置き、wp_reset_query()をループの最後に置くだけです。

これが役に立つことを願っています。 :)

5
Brian Fegter