问题描述

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