5

一連の投稿をバンドルするために使用するカスタム分類があります (シリーズはその分類の用語です)。私が望むのは、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 順) のみを表示し、ループ内のその分類の他の投稿を除外します。ループには、カスタム分類の一部ではない通常の投稿も含まれており、両方のタイプが複数のカテゴリに属し、タグを持っている場合があります。

4

1 に答える 1

2

ここに私の答えがあります(それはもっと提案です)

私のアプローチは、最初に、用語の最新の投稿からすべての id を選択し、分類の投稿シリーズに属します。

select * from wp_posts where ID in(
select ID from
(
select wp_posts.ID , wp_posts.post_date, d.name from wp_posts as a
join wp_term_relationships as b on ( a.ID = b.object_id)
join wp_term_taxonomy as c on (b.term_taxonomy_id = c.term_taxonomy_id)
join  wp_terms as d on (c.term_id = d.term_id)
where c.taxonomy = 'post-series'
group by d.name 
having (wp_posts.post_date = max(wp_posts.post_date))
)tmp)

その名前に1つのエントリが必要なため、d.nameでグループ化し、最大のpost_dateを持つ1つのエントリが必要なため、havingを使用します

次に、そのクエリから出てくるすべてのIDを選択し、それらをwhere ID in ()句で使用します

これをテストできませんでしたが、これがmysqlで解決する方法です。

于 2013-03-04T23:14:59.693 に答える