問題描述
我在一個會員頁面上,我使用自定義帖子型別與自定義分類法。我的自定義帖子型別稱為 member,我的自定義分類法稱為 member_groups 。
我想列出所有成員,但將它們組合在一起成為他們各自的組。
所以要清楚,我有 35 個成員分為 9 組 – 所以我不想做同樣的查詢九次,我想做一次,但將它們組合在一起,使 Member1,Member4 和 Member 11 組合在一起,稱為 「Marketing」 。
我正在使用 WP_Query 檢索帖子型別成員下的所有帖子。我嘗試了不同的嘗試,但沒有成功的結果。
我該如何實現呢?
最佳解決方案
因此,您可能會考慮自動執行多個查詢。
首先,讓您的自定義分類術語列表,使用 get_terms():
<?php
$member_group_terms = get_terms( 'member_group' );
?>
然後,迴圈遍歷每一個,每次執行一個新的查詢:
<?php
foreach ( $member_group_terms as $member_group_term ) {
$member_group_query = new WP_Query( array(
'post_type' => 'member',
'tax_query' => array(
array(
'taxonomy' => 'member_group',
'field' => 'slug',
'terms' => array( $member_group_term->slug ),
'operator' => 'IN'
)
)
) );
?>
<h2><?php echo $member_group_term->name; ?></h2>
<ul>
<?php
if ( $member_group_query->have_posts() ) : while ( $member_group_query->have_posts() ) : $member_group_query->the_post(); ?>
<li><?php echo the_title(); ?></li>
<?php endwhile; endif; ?>
</ul>
<?php
// Reset things, for good measure
$member_group_query = null;
wp_reset_postdata();
}
?>
我看不到有什麼特別的錯誤的方法,雖然它可能有限的擴充套件能力 (即,如果你有成千上萬的成員,或 member_group 術語,你可能會看到效能問題) 。
次佳解決方案
我透過使用自定義查詢找到一個解決方案,然後將其與術語名稱進行分組:
SELECT *
FROM wp_term_taxonomy AS cat_term_taxonomy
INNER JOIN wp_terms AS cat_terms ON cat_term_taxonomy.term_id = cat_terms.term_id
INNER JOIN wp_term_relationships AS cat_term_relationships ON cat_term_taxonomy.term_taxonomy_id = cat_term_relationships.term_taxonomy_id
INNER JOIN wp_posts AS cat_posts ON cat_term_relationships.object_id = cat_posts.ID
INNER JOIN wp_postmeta AS meta ON cat_posts.ID = meta.post_id
WHERE cat_posts.post_status = 'publish'
AND meta.meta_key = 'active'
AND meta.meta_value = 'active'
AND cat_posts.post_type = 'member'
AND cat_term_taxonomy.taxonomy = 'member_groups'
然後只需使用一個常規的 foreach 查詢,我可以提取我想要的資訊。
但是,如果有的話,我還是會以另一種方式感興趣,也許是使用 Wordpress 自己的功能。
第三種解決方案
更簡單:
$terms = get_terms('tax_name');
$posts = array();
foreach ( $terms as $term ) {
$posts[$term->name] = get_posts(array( 'posts_per_page' => -1, 'post_type' => 'post_type', 'tax_name' => $term->name ));
}
在所得到的 $ posts 陣列中,每個稅項是包含其帖子的巢狀陣列的關鍵。
第四種方案
我有這個確切的需要,Chip’s solution 工作,除了一件事:'field' => 'slug'是必需的。
foreach ( $service_categories as $category ) {
$services = new WP_Query(
array(
'post_type' => 'service',
'tax_query' => array(
array(
'taxonomy' => 'service_category',
'terms' => array( $category->slug ),
'operator' => 'IN',
'get' => 'all',
'field' => 'slug'
)
)
)
); ?>
<h2><?php echo $category->slug; ?></h2>
<?php if ( $services->have_posts() ) { // loop stuff goes here ?>
我也需要結果顯示為平坦,所以'get' => 'all'設定在這裡。
希望這可以幫助別人。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。