一連の投稿をバンドルするために使用するカスタム分類があります (シリーズはその分類の用語です)。私が望むのは、WordPress ループを実行するときに、これらのバンドルされた投稿を特別なケースとして扱うことです。
シリーズの最初の投稿 (最新の日付の投稿) のみを表示し、カスタム分類の用語に属さない他のすべての投稿は通常の投稿として扱う必要があります。カスタムシリーズの分類法とは別に、投稿はタグ付けまたは分類することもできます (したがって、カスタムの分類法を含めて最大 3 つの分類法)。ループには固定数の投稿が含まれている必要があります (たとえば、WordPress バックエンドで設定されたフロント ページの投稿数)。
すべてのデータが異なるテーブルにあり、各エントリが複数の分類法に属する可能性があるため、これらの投稿をグループ化する方法がわかりません。もちろん、posts 配列をループして、MySQL の呼び出し後に一連の古い投稿を破棄することは可能ですが、その場合、データベースに追加のクエリを行わずに一定数の投稿を維持することは困難です。
そこで、純粋な SQL ソリューションを実装したいと思います。posts_clauses
フックを使って実験しています。以下のクエリは、日付ではなく最大の ID を持つ投稿を返します。これは、データベースに負担をかけていると思います。
$clauses['fields'] .= ", $wpdb->posts.ID AS postID, (SELECT $wpdb->terms.term_id
FROM $wpdb->posts, $wpdb->term_taxonomy, $wpdb->term_relationships, $wpdb->terms
WHERE $wpdb->posts.ID=postID
AND $wpdb->term_taxonomy.taxonomy='post-series'
AND $wpdb->term_relationships.term_taxonomy_id=$wpdb->term_taxonomy.term_taxonomy_id
AND $wpdb->posts.ID=$wpdb->term_relationships.object_id
AND $wpdb->terms.term_id=$wpdb->term_taxonomy.term_id
ORDER BY $wpdb->posts.post_date DESC
LIMIT 0,1) AS uniqueID";
$clauses['groupby'] = "IFNULL(uniqueID,$wpdb->posts.ID)";
上記の句に基づいて、WordPress は次の SQL クエリを作成します。
SELECT SQL_CALC_FOUND_ROWS wp_posts.*, wp_posts.ID AS postID,
(SELECT wp_terms.term_id FROM wp_posts, wp_term_taxonomy, wp_term_relationships, wp_terms
WHERE wp_posts.ID=postID
AND wp_term_taxonomy.taxonomy='post-bundles'
AND wp_term_relationships.term_taxonomy_id=wp_term_taxonomy.term_taxonomy_id
AND wp_posts.ID=wp_term_relationships.object_id
AND wp_terms.term_id=wp_term_taxonomy.term_id
ORDER BY wp_posts.post_date DESC LIMIT 0,1)
AS uniqueID FROM wp_posts
WHERE 1=1
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')
GROUP BY IFNULL(uniqueID,wp_posts.ID)
ORDER BY wp_posts.post_date DESC
LIMIT 0, 10
このチュートリアルも読みましたが、この場合に当てはまるかどうかはわかりません。
要約すると、ループでは、カスタム分類の用語に属する最新の投稿 (post_date 順) のみを表示し、ループ内のその分類の他の投稿を除外します。ループには、カスタム分類の一部ではない通常の投稿も含まれており、両方のタイプが複数のカテゴリに属し、タグを持っている場合があります。