仅获取WP_QUERY当前帖子的分类术语

时间:2018-03-02 作者:Gabriel Souza

我试图找到一种方法,不显示分类法的所有术语,而只显示wp\\u查询中当前显示的帖子的术语。

下面的代码显示“brands”分类法的所有术语,查询显示当前类别的所有产品,我只想显示在显示的产品上设置的术语。

$marcas_terms = get_terms([
  \'taxonomy\' => \'brands\'
]);

foreach ($brands_terms as $brand_term) { 
  <input type="checkbox" id="<?php echo $brand_term->term_id; ?>" name="marca" value="<?php echo $brand_term->term_id; ?>">
  <label for="<?php echo $brand_term->term_id; ?>"><?php echo $brand_term->name; ?></label>
}

$args = array(
  \'post_type\' => \'product\',
  \'product_cat\' => get_queried_object()
);

$query = new WP_Query( $args );
   if ( $query->have_posts() ) {
     while( $query->have_posts() ) : $query->the_post();

        get_template_part("templates/product-content-category");

     endwhile;
   } wp_reset_postdata(); 

2 个回复
SO网友:David Sword

你可能会这样做

$args = array(
  \'post_type\' => \'product\',
  \'product_cat\' => get_queried_object()
);
$query = new WP_Query( $args );

$termsInPosts = array();
if ( $query->have_posts() ) {
    while( $query->have_posts() ) : $query->the_post();
        $postTerms = wp_get_post_terms(get_the_ID(), \'brands\', array(\'fields\' => \'term_id\'));
        foreach ($postTerms as $postTerm)
            if (!in_array($postTerm->term_id, $termsInPosts))
                $termsInPosts[] = $postTerm->term_id;
    endwhile;
} 

$marcas_terms = get_terms([
  \'taxonomy\' => \'brands\',
  \'include\' => $termsInPosts
]);

foreach ($brands_terms as $brand_term) { 
  <input type="checkbox" id="<?php echo $brand_term->term_id; ?>" name="marca" value="<?php echo $brand_term->term_id; ?>">
  <label for="<?php echo $brand_term->term_id; ?>"><?php echo $brand_term->name; ?></label>
}

if ( $query->have_posts() ) {
    while( $query->have_posts() ) : $query->the_post();
        get_template_part("templates/product-content-category");
    endwhile;
} 

wp_reset_postdata(); 
您所做的只是在前面运行循环,获取帖子中术语的id,添加到数组中,然后在调用get_terms() 您正在使用include 仅包括找到的术语。

我还没有测试过这段代码,它是徒手编写的,但它应该可以工作,或者至少可以引导您朝着正确的方向前进。

希望这有帮助。

SO网友:birgire

我想我们可以用object_ids 的参数get_terms(), 从给定的posts数组中提取post id。

如果我正确理解问题,下面是一个未经测试的框架:

// Your post query
$query = new WP_Query( $args );

if( $query->have_posts() ) {

    // Get terms from the post IDs of the above post query
    $brand_terms = get_terms( [
        \'taxonomy\'   => \'brands\',
        \'object_ids\' => wp_list_pluck( $query->posts, \'ID\' ),
    ] );

    // Your terms loop
    foreach ( $brands_terms as $brand_term ) { 
        // ...
    }

    // Your posts loop
    while( $query->have_posts() ) { 
        $query->the_post();
        get_template_part( "templates/product-content-category" );
    }

    wp_reset_postdata(); 
}
希望有帮助。

结束