问题描述
我在一个会员页面上,我使用自定义帖子类型与自定义分类法。我的自定义帖子类型称为 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。