2013-03-04 21 views
5

私は、一連の記事をまとめるために使用するカスタムタクソノミーを持っています(シリーズはそのタクソノミの用語です)。私が望むのは、WordPressループを実行するときに、バンドルされた投稿を特殊なケースとして扱うことです。WordPressループのカスタムタクソノミからの最後の投稿を表示

シリーズの最初の投稿(最新の日付のもの)のみが表示され、カスタム分類の用語に属していない他の投稿はすべて通常の投稿として扱われます。カスタムシリーズタクソノミとは別に、投稿にタグを付けたり、カテゴリを分類したりすることもできます(カスタムタグも含めて最大3つの分類が可能です)。ループには一定数の投稿(たとえば、WordPressバックエンドに設定されたフロントページの投稿の数)が含まれている必要があります。

私はこれらの投稿をグループ化する方法が失われています。その理由の1つは、すべてのデータが異なるテーブルにあり、各エントリが複数のタクソノミに属している可能性があるからです。もちろん、posts配列をループして、MySQLコールの後でシリーズ内の古い投稿を破棄することは可能ですが、その場合、固定数の投稿をデータベースに追加クエリを作成しなければ維持することは困難です。

私は純粋なSQLソリューションを実装したいと思います。私はposts_clausesフックを試してみました。以下のクエリは、日付ではなくIDが最も高い投稿を返します。データベースに負担をかけると私は信じています。 WordPressの上記の条項に基づいて

$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)"; 

は、次の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 

私はまたthis tutorialを読んだが、私はそれが、この場合に適用されるかわかりません。

要約:ループでは、カスタム分類からの最新の投稿(post_dateで注文)を表示し、その分類内の他の投稿をループ内で除外したいだけです。ループにはカスタムタクソノミの一部ではない通常の投稿も含まれ、両方のタイプは複数のカテゴリに属しタグを持つことができます。ここで[OK]を

+0

私はトリックを行う必要がありますSQLクエリを投稿する場合、あなたのための任意の使用です。 wordpressがクエリを構築する方法について私は何も知らないので? – Miguelo

+0

私はそれが大きな助けになると思います! WordPressでクエリを作成しても問題はありません。 – mensch

+0

質問と希望の結果とともにサンプルレコードを追加できる方がずっと良いでしょう。ありがとう。 –

答えて

2

が私の答えである(それはだより提案)

任期の中で最も最近だと分類ポストシリーズに属しているポストからすべてのIDを選択するには、最初のだろう私のaproach。

あなたはその名前のための1つのエントリをしたいとあなたは最大post_date

を持っている一つのエントリをしたいので、持っ使用しているので、私はその後、私はそれから出てくるすべてのIDを選択するd.nameによってグループ化

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) 

クエリを使用してwhere ID in()

これをテストできませんでしたが、これは私がどのように私はそれをmysqlで解決するだろうです。

+0

ありがとうございますが、残念ながらこれは動作していません。 MySQLは、3番目のSELECT文(wp_posts)の未知の列に関するエラーを返します。そしてHAVINGセクションに。それらを 'a.ID'と' a.post_date'に変更すると、クエリはエラーなく実行されますが、行は返されません。結果を返さない2番目のサブクエリによって発生したように見えます。 – mensch

+0

「HAVING」を削除すると、シリーズタクソノミに含まれる行が1つ返されますが、カテゴリタクソノミの他の投稿は返されません。 – mensch

+0

ok私が確かに分かっていなかったことは、 'a.ID = b.object_id'がobject_idが投稿IDであることを確認でき、グループをd.name、a.post_dateあなたは複数の行を取得します。 – Miguelo

関連する問題