我想在single.php上使用wp_tag_cloud(),使用获取特定类别所有标记的参数,包括其子类别和帖子中的所有标记。
答案 0 :(得分:13)
Wordpress中没有本地方法可以执行此操作。标签与类别无关,因此它们是分开的。话虽这么说,通过特定类别获取所有标签IN USE的唯一方法是循环浏览该类别的每个帖子并获取每个帖子的标签。
我已经写了一个快速的功能来做到这一点。
将此函数放入functions.php文件中。
function get_tags_in_use($category_ID, $type = 'name'){
// Set up the query for our posts
$my_posts = new WP_Query(array(
'cat' => $category_ID, // Your category id
'posts_per_page' => -1 // All posts from that category
));
// Initialize our tag arrays
$tags_by_id = array();
$tags_by_name = array();
$tags_by_slug = array();
// If there are posts in this category, loop through them
if ($my_posts->have_posts()): while ($my_posts->have_posts()): $my_posts->the_post();
// Get all tags of current post
$post_tags = wp_get_post_tags($my_posts->post->ID);
// Loop through each tag
foreach ($post_tags as $tag):
// Set up our tags by id, name, and/or slug
$tag_id = $tag->term_id;
$tag_name = $tag->name;
$tag_slug = $tag->slug;
// Push each tag into our main array if not already in it
if (!in_array($tag_id, $tags_by_id))
array_push($tags_by_id, $tag_id);
if (!in_array($tag_name, $tags_by_name))
array_push($tags_by_name, $tag_name);
if (!in_array($tag_slug, $tags_by_slug))
array_push($tags_by_slug, $tag_slug);
endforeach;
endwhile; endif;
// Return value specified
if ($type == 'id')
return $tags_by_id;
if ($type == 'name')
return $tags_by_name;
if ($type == 'slug')
return $tags_by_slug;
}
然后,当您想要获取特定类别的标签时,请像这样调用此函数:
// First paramater is the category and the second paramater is how to return the tag (by name, by id, or by slug)
// Leave second paramater blank to default to name
$tags = get_tags_in_use(59, 'name');
希望这有帮助。
编辑:
这是您需要与另一个一起使用的功能:
function tag_cloud_by_category($category_ID){
// Get our tag array
$tags = get_tags_in_use($category_ID, 'id');
// Start our output variable
echo '<div class="tag-cloud">';
// Cycle through each tag and set it up
foreach ($tags as $tag):
// Get our count
$term = get_term_by('id', $tag, 'post_tag');
$count = $term->count;
// Get tag name
$tag_info = get_tag($tag);
$tag_name = $tag_info->name;
// Get tag link
$tag_link = get_tag_link($tag);
// Set up our font size based on count
$size = 8 + $count;
echo '<span style="font-size:'.$size.'px;">';
echo '<a href="'.$tag_link.'">'.$tag_name.'</a>';
echo ' </span>';
endforeach;
echo '</div>';
}
所以你可以像这样使用这个功能:
tag_cloud_by_category($cat_id);
答案 1 :(得分:7)
在主题的functions.php中插入以下函数:
function get_category_tags($args) {
global $wpdb;
$tags = $wpdb->get_results
("
SELECT DISTINCT terms2.term_id as tag_id, terms2.name as tag_name, null as tag_link
FROM
wp_posts as p1
LEFT JOIN wp_term_relationships as r1 ON p1.ID = r1.object_ID
LEFT JOIN wp_term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
LEFT JOIN wp_terms as terms1 ON t1.term_id = terms1.term_id,
wp_posts as p2
LEFT JOIN wp_term_relationships as r2 ON p2.ID = r2.object_ID
LEFT JOIN wp_term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
LEFT JOIN wp_terms as terms2 ON t2.term_id = terms2.term_id
WHERE
t1.taxonomy = 'category' AND p1.post_status = 'publish' AND terms1.term_id IN (".$args['categories'].") AND
t2.taxonomy = 'post_tag' AND p2.post_status = 'publish'
AND p1.ID = p2.ID
ORDER by tag_name
");
$count = 0;
foreach ($tags as $tag) {
$tags[$count]->tag_link = get_tag_link($tag->tag_id);
$count++;
}
return $tags;
}
在主题文档中调用函数如下。请注意,它接受多个类别ID:
$args = array(
'categories' => '12,13,14'
);
$tags = get_category_tags($args);
这将返回一个数组,您可以使用以下命令执行以下操作:
$content .= "<ul>";
foreach ($tags as $tag) {
$content .= "<li><a href=\"$tag->tag_link\">$tag->tag_name</a></li>";
}
$content .= "</ul>";
echo $content;
答案 2 :(得分:2)
我正在接近这一点。
<div class="tag_cloud_on_single">
<h2>Popular Topics</h2>
<?php
$category = get_the_category();
$root_cat_of_curr = $category[0]->category_parent;
function get_cat_slug($cat_id) {
$cat_id = (int) $cat_id;
$category = &get_category($cat_id);
return $category->slug;
}
$my_cat = get_cat_slug($root_cat_of_curr);
$custom_query = new WP_Query('posts_per_page=-1&category_name='.$my_cat.'');
if ($custom_query->have_posts()) :
while ($custom_query->have_posts()) : $custom_query->the_post();
$posttags = get_the_tags();
if ($posttags) {
foreach($posttags as $tag) {
$all_tags[] = $tag->term_id;
}
}
endwhile;
endif;
$tags_arr = array_unique($all_tags);
$tags_str = implode(",", $tags_arr);
$args = array(
'smallest' => 12,
'largest' => 24,
'unit' => 'pt',
'number' => 0,
'format' => 'flat',
'separator' => " ",
'orderby' => 'name',
'order' => 'RAND',
'exclude' => null,
'topic_count_text_callback' => default_topic_count_text,
'link' => 'view',
'echo' => true,
'include' => $tags_str
);
wp_tag_cloud($args);
?>
</div>
感谢您的贡献。感谢您的帮助。