カスタムクエリで問題が発生しています。あなたの助けが必要です。
特定のカテゴリの投稿をすべて表示したいのですが、このスニペットが見つかります。
// 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回表示されます。
どうすればこの問題を解決できますか?
君たちありがとう。
query_posts()
を使用しないでください。
特定のカテゴリの投稿に同時にタグを付けるための単一のクエリを作成できる場合は、各カテゴリに対してクエリを実行する必要はありません。これはより効率的であると同時にあなたが重複で終わらないようにするための手段でもあります。
メインクエリを置き換えるためにquery_posts()
を使っていたので、正しい解決策はそれから pre_get_posts
アクション フックでメインクエリを修正することです - あるいは完全にそれを置き換えるあなた自身のデザインの WP_Query
インスタンス。特に、 カテゴリパラメータ - カテゴリIDの配列を指定できるcategory__in
を使う必要があります。
それでも、あなたのコードはあまり意味がありません - それはすべてのカテゴリのリストを取得してから、同じカテゴリ0
を異なるカテゴリの何倍もクエリします。つまり、6つの異なるカテゴリがある場合、そのコードは各一意のカテゴリをクエリするのではなく、投稿についてカテゴリ0
を6回クエリします。
さらに、既存のすべてのカテゴリに投稿をクエリしたい場合は、カテゴリクエリ引数を含める理由はまったくありません。カテゴリクエリ引数を省略すると、WordPressは任意のカテゴリの投稿に対してクエリを実行します。
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