The default WordPress tag cloud includes nasty stuff like inline styling. I needed to be able to style the tags with a single class that included the tag weight in its name. It also needed the tags to be displayed in a list. The result turned the separate tag markup from
<a href="http://randomsite.com/tag/lolcats/" class="tag-link-5" title="3 tag" style="font-size: 32pt">Lolcats</a>
into
<li class="tag-10"> <a href="http://randomsite.com/tag/lolcats/">Lolcats</a> </li>
First we create a simple value object representing a tag.
class Custom_Tag { var $name, $link, $class; public function Custom_Tag($name, $link, $class) { $this->name = $name; $this->link = $link; $this->class = $class; } }
Then we go through all the tags and assign each a class depending on its weight. Those occurring the least will get the class tag-1 and those occurring most frequent will get the class tag-10. The function will return an array of Custom_Tag objects.
function custom_generate_tag_cloud($tags) { if($tags) { $smallest_class = 1; $largets_class = 10; $counts = array(); foreach ($tags as $key => $tag) { $counts[$key] = $tag->count; } $min_count = min($counts); $spread = max($counts) - $min_count; if ( $spread <= 0 ) $spread = 1; $class_spread = $largets_class - $smallest_class; if ( $class_spread < 0 ) $class_spread = 1; $class_step = $class_spread / $spread; $cloud_tags = array(); foreach ($tags as $key => $tag) { $count = $counts[$key]; $class = 'tag-' . round($smallest_class + ( ( $count - $min_count ) * $class_step )); $cloud_tags[] = new Custom_Tag($tag->name, $tag->link, $class); } } return $cloud_tags; }
Finally we collect the tag objects created in the function above and output some html. We also add a filter hook for “wp_generate_tag_cloud”.
function custom_tag_cloud($return, $tags, $args) { $tag_array = custom_generate_tag_cloud($tags); $cloud_tags = array(); $return = "<ul>\n"; foreach ($tag_array as $tag) { $cloud_tags[] = '<li class="' . $tag->class . '"><a href="' . $tag->link . '">' . $tag->name . "</a></li>\n"; } $return .= join('', $cloud_tags); $return .= "</ul>\n"; return $return; } add_filter('wp_generate_tag_cloud', 'custom_tag_cloud', 10, 3);