根据特定类别(包括子类别和帖子中的所有标签)获取所有标签wordpress

时间:2014-04-01 13:27:01

标签: wordpress tags

我想在single.php上使用wp_tag_cloud(),使用获取特定类别所有标记的参数,包括其子类别和帖子中的所有标记。

3 个答案:

答案 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'                 => "&nbsp;&nbsp;&nbsp;",
        '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>

感谢您的贡献。感谢您的帮助。