Get all tags based on specific category (including all tags from child categories and posts) wordpress

后端 未结 3 704
慢半拍i
慢半拍i 2021-02-03 11:44

I wanted to use wp_tag_cloud() on single.php using the argument that gets all tags from specific category including all tags from its child categories and posts.

3条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-02-03 12:11

    There is no native way in Wordpress to do this. The reason being that tags are not tied to categories, they are separate. That being said, the only way to get all tags IN USE by a specific category is to cycle through every post of the category and grab the tags of each post.

    I've written up a quick function to do just that.

    Place this function into your functions.php file.

    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;
    }
    

    Then when you want to grab the tags of a specific category, call this function like so:

    // 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');
    

    Hope this helps.

    EDIT:

    This is the function you will need to use in conjunction with the other:

    function tag_cloud_by_category($category_ID){
        // Get our tag array
        $tags = get_tags_in_use($category_ID, 'id');
    
        // Start our output variable
        echo '
    '; // 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 ''; echo ''.$tag_name.''; echo ' '; endforeach; echo '
    '; }

    So you can use this function simply like so:

    tag_cloud_by_category($cat_id);
    

提交回复
热议问题