如何在wordpress中的类别下获取帖子的唯一标签?

时间:2013-08-05 23:09:44

标签: wordpress taxonomy

我有一个非常新手的问题要问专家。我需要获取特定类别下的帖子的唯一标签。

为了更清楚,我们假设我有30个类别的帖子。从他们那里我拿Car类别,这个类别下有30个帖子。再次假设我有100多个'发布标签',并且这些30个帖子在汽车类别下标记为35个标签。

如何使用“Car”类别获取这35个标签?

我可以执行寻找标记列表的原始数据库查询,但我对一些更优雅和正确的方法感兴趣。

先谢谢。

2 个答案:

答案 0 :(得分:0)

最佳解决方法是编写自定义SQL查询并一次获取所有标记。任何其他使用WP核心功能的方法都会产生大量的小型SQL查询,这是多余的。

使用此查询获取所有类别标记:

SELECT DISTINCT pt.term_id, pt.name
  FROM wp_terms AS t
  LEFT JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id
  LEFT JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id
  LEFT JOIN wp_term_relationships AS ptr ON ptr.object_id = tr.object_id AND ptr.term_taxonomy_id <> tr.term_taxonomy_id
  LEFT JOIN wp_term_taxonomy AS ptt ON ptt.term_taxonomy_id = ptr.term_taxonomy_id AND ptt.taxonomy = 'post_tag'
  LEFT JOIN wp_terms AS pt ON pt.term_id = ptt.term_id
 WHERE t.name = 'Car' AND tt.taxonomy = 'category' AND pt.term_id IS NOT NULL
 ORDER BY pt.term_id

答案 1 :(得分:0)

您必须根据产品类别获得所有唯一标签。将以下代码添加到functions.php中,并在需要的任何位置使用此钩子。 do_action('archive_tag_filters_action');

function archive_tag_filters_callback() {
$category = get_queried_object();

$args = array(
    'post_type'             => 'product',
    'post_status'           => 'publish',
    'posts_per_page'        => '-1',
    'tax_query'             => array(
        array(
            'taxonomy'      => 'product_cat',
            'field'         => 'id', 
            'terms'         =>  $category->term_id, //category id
            'operator'      => 'IN' 
        )
    )
);

$query = new WP_Query( $args );
$term_array = $tags_unique  = array();

while( $query->have_posts() ) {
      $query->the_post();
      
      $terms = get_the_terms( get_the_ID(), 'product_tag' );
      if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
            foreach ( $terms as $term ) {
                 $term_array[] = array(
                    'term_text' => $term->name,
                    "term_link" => get_term_link( $term )
                 );
             }
      }
}


foreach ($term_array as $row) {
    $tags_unique[$row['term_text']] = $row;
}

$current_tags = array_values($tags_unique);

if ( $current_tags ) {
  echo '<ul>';
  foreach ( $current_tags as $term ) {
      echo '<li>';
      echo '<a href="' . $term['term_link'] . '">';
      echo $term['term_text'];
      echo '</a>';
      echo '</li>';
  }
  echo '</ul>';
}
else{
    echo '<ul>';
    echo '<li>No results.</li>';
    echo '</ul>';
}
}
add_action( 'archive_tag_filters_action', 'archive_tag_filters_callback', 10, 2 );