Too many wordpress tags?

If you had a plugin a few years ago like SEO SearchTerms Tagging 2 or others that added tags to posts when people searched for those terms.
You might find now that your theme has hundreds of tags that are not used or barely used, cluttering up your site.

So here’s a little SQL you can use to clean up those tags.


DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE count = 0 );
DELETE FROM wp_term_taxonomy WHERE term_id not IN (SELECT term_id FROM wp_terms);
DELETE FROM wp_term_relationships WHERE term_taxonomy_id not IN (SELECT term_taxonomy_id FROM wp_term_taxonomy);

This removes all tags with 0 posts. Change the wp_term_taxonomy WHERE count = 0 to wp_term_taxonomy WHERE count = 1 and you’ll remove all the tags used only once. change the 1 to a 2 and you’ll remove all the tags only used twice etc etc..

messing around with preg_replace….

I am probably trying to reinvent the wheel here but…..

I wanted to get the top 20 or so tags from a wordpress blog and to use the tags for a loop of 3 posts from each tag.

The only function i could find to get the most used tags was wp_tag_cloud

by taking it into an array i could get the top 20 tags.

$tags = wp_tag_cloud( array( 'number' => '20', 'order' => 'DESC', 'echo' => 'false', 'format' => 'array' ) );

I looped through this array using:

 foreach($tags as $tag)

unfortunately the wp_tag_cloud did not return a list of tag id’s for me to  loop through.

each $tag was in the format of a url,  i.e. <a id=”” href=”http://domain.com/tag/post_slug” style=””>tag name</a>

So i needed to extract data from this to find the tag.  i chose to extract the tag slug which would be in the url.

$tagslug= preg_replace(‘%<a .*? ?href=[“\’]([^”\’]*).*?>.*?</a>%i’, ‘$1’, $tag);

returned the url for me.  Unfortunately my regular expression skills are pretty poor and couldn’t work out how to extract the slug straight away using markers. (my university professor would not be proud.)

so i took the url and ran another preg_replace on it to get the tag slug

$tagslug = preg_replace(“/.*\.(com|gov|org|net|mil|edu)\/tag\/([a-z_\-]+).*/i”,’$2′,$tagslug);

This finally returned the tag’s slug for me,  I had a wee function called get_tag_id_by_slug i made so i called that.

$thetagid= get_tag_id_by_slug($tagslug);

which returned the tag id number for me, so finally i could use
$term = get_tag($thetagid);

to get the actual term to use in my wordpress loop

$new_query = new WP_Query(‘r_sortby=highest_rated&r_orderby=desc&posts_per_page=4&tag=’. $term->slug);
while ( $new_query->have_posts() ) : $new_query->the_post();

 

My function to get the id from the slug is:

function get_tag_id_by_slug($tag_slug) {
global $wpdb;
$tag_ID = $wpdb->get_var(“SELECT * FROM “.$wpdb->terms.” WHERE `slug` = ‘”.$tag_slug.”‘”);
return $tag_ID;}

 

After doing all this i decided that its all very well to automate things but some of my most used tags were very similar and i didn’t want a loop containing the same 4 posts over and over with a new title.  So in the end i just went with.

$tags=get_tags(‘include=7,8,11,30,45’);

and looped that!

DOH!