web-dev-qa-db-ja.com

カテゴリ内の投稿に対するWordpressのカスタムクエリで、投稿が複数回表示される

カスタムクエリで問題が発生しています。あなたの助けが必要です。

特定のカテゴリの投稿をすべて表示したいのですが、このスニペットが見つかります。

// get all the categories from the database
    $cats = get_categories(); 
    // loop through the categries
    foreach ($cats as $cat) {
        // setup the cateogory ID
        $cat_id= 0;
        // Make a header for the cateogry
        // create a custom wordpress query
        query_posts("cat=$cat_id&posts_per_page=22");
        // start the wordpress loop!
        if (have_posts()) : while (have_posts()) : the_post(); 

投稿が複数のカテゴリに分類されている場合、これは問題ありませんが、他のすべての投稿は2、3回表示されます。

例:カテゴリ0の投稿をすべてリストしたい。投稿1と投稿2の2つの投稿がある。投稿1もカテゴリ1にあります。投稿1と投稿2はフロントエンドに2回表示されます。

どうすればこの問題を解決できますか?

君たちありがとう。

1
WP_Newbee

query_posts()を使用しないでください。

特定のカテゴリの投稿に同時にタグを付けるための単一のクエリを作成できる場合は、各カテゴリに対してクエリを実行する必要はありません。これはより効率的であると同時にあなたが重複で終わらないようにするための手段でもあります。

メインクエリを置き換えるためにquery_posts()を使っていたので、正しい解決策はそれから pre_get_postsアクション フックでメインクエリを修正することです - あるいは完全にそれを置き換えるあなた自身のデザインの WP_Query インスタンス。特に、 カテゴリパラメータ - カテゴリIDの配列を指定できるcategory__inを使う必要があります。

それでも、あなたのコードはあまり意味がありません - それはすべてのカテゴリのリストを取得してから、同じカテゴリ0を異なるカテゴリの何倍もクエリします。つまり、6つの異なるカテゴリがある場合、そのコードは各一意のカテゴリをクエリするのではなく、投稿についてカテゴリ0を6回クエリします。

さらに、既存のすべてのカテゴリに投稿をクエリしたい場合は、カテゴリクエリ引数を含める理由はまったくありません。カテゴリクエリ引数を省略すると、WordPressは任意のカテゴリの投稿に対してクエリを実行します。

0
bosco

query_posts(およびネストされたwhile (have_posts())ループ)をforループ内に配置することにより、ループを再実行し、実際にメインクエリを破壊しています。query_postsのドキュメントでメインループを変更する他の方法を探します。

https://developer.wordpress.org/reference/functions/query_posts/

Get_posts呼び出しにアクションフックを使用してtax_queryを調整すると、より良い結果が得られます

function wpse257739_custom_categories_posts( $q ) {
  if ( $q->is_main_query() ) {
    $q->set( 'tax_query', array(
      'taxonomy' => 'category',
      'field' => 'slug',
      'terms' => array( 'category-one', 'category-2' ),
      'operator' => 'IN' // redundant
    ) );
  }
}

add_action( 'pre_get_posts', 'wpse257739_custom_categories_posts` );

完全なドキュメントの詳細: https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

0
totels