0

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

为了更清楚,让我们假设我有 30 个类别的帖子。我从他们那里选择汽车类别,这个类别下有 30 个帖子。再次假设我有 100 多个“帖子标签”,并且汽车类别下的这 30 个帖子被标记在 35 个标签下。

如何使用“汽车”类别获得这 35 个标签?

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

先谢谢了。

4

2 回答 2

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
于 2013-08-06T06:14:19.243 回答
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 );
于 2020-10-13T11:24:10.340 回答