显示按自定义分类分组的自定义帖子类型中的所有帖子

时间:2011-11-04 作者:Mestika

我正在处理一个成员页面,在该页面中,我使用了一个带有自定义分类法的自定义帖子类型。调用我的自定义帖子类型member 我的自定义分类法叫做member_groups.

我想列出所有成员,但将他们分组到各自的组中。

因此,要明确的是,我有35个成员,分为9个组–因此,我不想九次进行相同的查询,而是将它们分组,以便将Member1、Member4和Member11分组在一个组中,称为“Marketing”。

我正在使用WP_Query 检索post type member下的所有帖子。我尝试了不同的尝试,但没有成功的结果。

我如何才能做到这一点?

7 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

因此,您可以考虑自动化多个查询。

首先,使用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\\u group terms,您可能会看到性能问题)。

SO网友:Mestika

我通过使用自定义查询并将其与术语名称分组找到了解决方案:

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自己的功能。

SO网友:djb

更简单的是:

$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数组中,每个税项都是包含其posts的嵌套数组的键。

SO网友:bigsweater

我有这个确切的需要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\' 设置在此处。

希望这对其他人有所帮助。

SO网友:61Pixels

几年前我在一个项目上做过这个。与djb的答案相似,只是有更多的细节。这将把你所有的分类名称输出为h3,并将每个帖子标题的项目符号列表链接到它们的详细页面。

<?php // Output all Taxonomies names with their respective items
$terms = get_terms(\'member_groups\');
foreach( $terms as $term ):
?>                          
    <h3><?php echo $term->name; // Print the term name ?></h3>                          
    <ul>
      <?php                         
          $posts = get_posts(array(
            \'post_type\' => \'member\',
            \'taxonomy\' => $term->taxonomy,
            \'term\' => $term->slug,                                  
            \'nopaging\' => true, // to show all posts in this taxonomy, could also use \'numberposts\' => -1 instead
          ));
          foreach($posts as $post): // begin cycle through posts of this taxonmy
            setup_postdata($post); //set up post data for use in the loop (enables the_title(), etc without specifying a post ID)
      ?>        
          <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>    
        <?php endforeach; ?>
    </ul>                                                   
<?php endforeach; ?>

SO网友:AKnox

$query = new WP_Query( 
   array ( 
      \'post_type\' => \'member\', 
      \'orderby\'   => \'meta_value\', 
      \'meta_key\'  => \'member_group\' 
   ) 
);
然后,当您循环这个查询时,您可以沿着这些行使用if(在php伪代码中)

$groupName = "";
$counter = 0;
if havePosts: while havePosts: thePost

if( $groupName != post->meta_value )
{
if ($counter > 0)
{
</ul>
}
<h1>A group name</h1>
<ul>
<li>member name</li>
}
else
{
<li>member name</li>
}

endwhile;endif

</ul>
我希望这有帮助。我想你把事情弄得比需要的复杂得多。

更多信息:http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

SO网友:Marcelo Viana

嗯,这是一条旧线索,但如果有人像我一样路过,这可能会有所帮助。我们的想法是修改主查询,这样我们就不需要使用模板并生成新的查询和循环。。。

PS:尚待在大型数据库中测试。我的情况令人满意。

function grouped_by_taxonomy_main_query( $query ) {

    if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage

        $post_ids = array();

        $terms = get_terms(\'my_custom_taxonomy\');

        foreach ( $terms as $term ) {
            $post_ids = array_merge( $post_ids, get_posts( array( 
                \'posts_per_page\' => 4, // as you wish...
                \'post_type\' => \'my_custom_post_type\', // If needed... Default is posts
                \'fields\' => \'ids\', // we only want the ids to use later in \'post__in\'
                \'tax_query\' => array( array( \'taxonomy\' => $term->taxonomy, \'field\' => \'term_id\', \'terms\' => $term->term_id, )))) // getting posts in the current term
            );
        }

        $query->query_vars[\'post_type\'] = \'my_custom_post_type\'; // Again, if needed... Default is posts
        $query->query_vars[\'posts_per_page\'] = 16; // If needed...
        $query->query_vars[\'post__in\'] = $post_ids; // Filtering with the post ids we\'ve obtained above
        $query->query_vars[\'orderby\'] = \'post__in\'; // Here we keep the order we generated in the terms loop
        $query->query_vars[\'ignore_sticky_posts\'] = 1; // If you dont want your sticky posts to change the order

    }
}

// Hook my above function to the pre_get_posts action
add_action( \'pre_get_posts\', \'grouped_by_taxonomy_main_query\' );

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post