2013-03-04 86 views
5

我有一個自定義分類標準,我用它來串聯發佈帖子(一系列是該分類標準中的一個術語)。我想要的是在執行WordPress循環時將這些捆綁的帖子視爲特殊情況。顯示在WordPress循環中自定義分類標準的日期的最後一篇文章

只應顯示系列中的第一個帖子(具有最新日期的帖子),並且不屬於自定義分類中術語的所有其他帖子應視爲普通帖子。除了定製系列分類標準之外,還可以對帖子進行標記或分類(因此最多包含三個分類標準,包括自定義分類標準)。循環應包含固定數量的帖子(例如,在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 

我也看到this tutorial,但我不知道它適用於這種情況。

因此總結:在循環中,我只想顯示屬於自定義分類的術語的最新帖子(按post_date排序),並排除該分類中的其他帖子。該循環還包含不屬於自定義分類法的常規帖子,並且這兩種類型可能屬於多個類別並具有標籤。

+0

是否有任何用途,如果我發佈的SQL查詢應該做的伎倆。因爲我不知道wordpress構建查詢的方式。 – Miguelo 2013-03-04 22:19:12

+0

我認爲這將是一個很大的幫助!在WordPress中構建查詢對我來說不應該是一個問題。 – mensch 2013-03-04 22:43:42

+0

如果您可以添加樣本記錄以及您的問題和期望結果,情況會好得多。謝謝。 – 2013-03-27 16:22:25

回答

2

確定這裏就是我的回答(它更建議)

我的aproach將首先從那就是最近在他們的任期,屬於分類後的一系列職位選擇每一個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) 

我的d.name因爲你要爲這個名字一個條目,因爲你想擁有最大POST_DATE

然後我選擇所有的ID,從所出現的一個條目使用具有分組查詢和使用它們在where ID in()子句

我無法測試這個,但這是我如何解決它在MySQL中。

+0

謝謝,但不幸的是,這似乎不工作。 MySQL在第三個SELECT語句(wp_posts)中給出了關於未知列的錯誤。在HAVING部分。將它們更改爲'a.ID'和'a.post_date'可以使查詢無誤地運行,但它不會返回任何行。它似乎是由第二個子查詢引起的,它不返回任何結果。 – mensch 2013-03-05 08:15:13

+0

刪除'HAVING'會返回一個系列分類中的行,但不會返回類別分類中的其他文章。 – mensch 2013-03-05 08:20:48

+0

確定一件事我不確定的是,如果'a.ID = b.object_id'你能確認object_id是帖子ID,你可以將組更改爲'group by d.name,a.post_date '所以你得到不止一行。 – Miguelo 2013-03-05 10:00:40

相關問題