我有一个非常新手的问题要问专家。我需要获取特定类别下的帖子的唯一标签。
为了更清楚,我们假设我有30个类别的帖子。从他们那里我拿Car类别,这个类别下有30个帖子。再次假设我有100多个'发布标签',并且这些30个帖子在汽车类别下标记为35个标签。
如何使用“Car”类别获取这35个标签?
我可以执行寻找标记列表的原始数据库查询,但我对一些更优雅和正确的方法感兴趣。
先谢谢。
答案 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 );