我有一个非常新手的问题要问专家。我需要获取特定类别下帖子的唯一标签。
为了更清楚,让我们假设我有 30 个类别的帖子。我从他们那里选择汽车类别,这个类别下有 30 个帖子。再次假设我有 100 多个“帖子标签”,并且汽车类别下的这 30 个帖子被标记在 35 个标签下。
如何使用“汽车”类别获得这 35 个标签?
我可以执行原始数据库查询来寻找标签列表,但我对一些更优雅和正确的方法感兴趣。
先谢谢了。
最好的解决方法是编写自定义 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
您必须根据产品类别实现所有唯一标签。将以下代码添加到 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 );