問題描述
我的問題很簡單,我使用 WP_Query 來檢索一些使用 tax_query 的分類法過濾自定義型別的帖子。
現在我的問題是我想按照分類法排序,但是從檔案和在網路中搜尋我找不到解決方案。
WP_Query 中的順序讓我們透過一堆欄位甚至自定義元欄位進行排序,但它似乎不支援分類法。
任何指標在正確的方向?
謝謝你們。
最佳解決方案
不,不可能透過分類法進行排序,因為從某種型別的觀點來看,實際上並沒有什麼意義。
分類法是將事情分組在一起的方式。所以在職位上有一個分類標準的那一點真的是要在職位之間分享這個分類學的術語。如果一個分類學的術語只用於一個職位,那麼這樣就會使分類學無意義。而且如果這些條款被分享就像它們應該是這樣,那麼它的命令就不會產生任何特別有用的東西。
在這種情況下你應該使用的是後期元。您可以透過 post meta 命令,並且每個帖子都是唯一的。
編輯:也就是說,您可以透過使用過濾器進行自定義 SQL 查詢,透過分類法進行排序,您不能從未修改的 WP_Query:http://scribu.net/wordpress/sortable-taxonomy-columns.html
但是,如果您不得不訴諸於此類事情,那麼您的資料設計結構首先是錯誤的。 “Terms” 在分類中不是實際的”data” 。這些術語本身沒有固有的含義,它們只是他們描述的特定分組的標籤。如果你把它們視為有意義的資料,那麼你有一個潛在的設計缺陷。
分類法透過為其分配條款來分組事物。該分組是分類法的整體,術語只是分組中的漂亮臉。如果您有有意義的後設資料分配給一個帖子,那麼您應該使用後期後設資料。而且您可以訂購,因為後期後設資料使用鍵和值來儲存資訊。使用分類法,您實際上只儲存金鑰,其值為該術語分組在一起的帖子。
如果您使用正確的方法,長遠來說,事情會更容易。雖然我不是說你不能用分類法做一些奇怪的事情,但是從長遠來看,只要使用錯誤就能使事情變得更加困難。
次佳解決方案
這個問題的接受答案是不能接受的。假設稅收排序 「沒有意義」 是不合邏輯的。他給的答案沒有意義。
考慮有一個選單帖子型別。那麼你有一個”FoodCategories” 的定製稅。 FoodCategories 稅有”Breakfast”,”Lunch” 和”Dinner” 條款。如果您使用 tax_query 引數提交查詢,則您現在將具有所有條款的結果集,但是按釋出日期排序。
為了得到正確的訂單,相對於他們的條款,然後透過將帖子分隔成各自的類別,正確地顯示在前端,您必須迴圈遍歷結果集,然後查詢每個單獨的帖子結果集找到它的術語並與當前術語進行比較,過濾到陣列中並繼續進行。那麼你必須再次迴圈顯示新的陣列。這沒有生產力。
如果 WP 有一個”tax__in” orderby 選項,那麼它會很好,因為它是一個”post__in”,但是由於沒有,你要麼做上述可笑的過程; 透過’posts_orderby’ 過濾器和’posts_join’ 過濾器自定義查詢,以便透過方法調整順序並將術語分別新增到結果集中; 或者您必須針對相對於這些術語在 HTML 部分中篩選的每個術語進行新的查詢。
最有效的方法是透過過濾器更改查詢字串。最簡單的是做三個單獨的查詢。 WP API 應該按照稅收排序或任何限制性查詢引數進行處理。如果您是基於某些條件限制查詢,那麼許多人將很可能需要透過相同條件進行排序。
第三種解決方案
是的,但它是相當涉及…
新增到您的主題中的 functions.php:
function orderby_tax_clauses( $clauses, $wp_query ) {
global $wpdb;
$taxonomies = get_taxonomies();
foreach ($taxonomies as $taxonomy) {
if ( isset( $wp_query->query['orderby'] ) && $taxonomy == $wp_query->query['orderby'] ) {
$clauses['join'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
$clauses['where'] .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
$clauses['groupby'] = "object_id";
$clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
$clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
}
}
return $clauses;
}
add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );
這是從一些發現的東西和一些我自己做的東西。解釋是非常艱難的,但是底線是這樣執行的,你可以放置?orderby =(分類法查詢 var)& order = ASC(或 DESC),她會直接關閉!
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。