Limit tags by date
-
Hello,
I may be blind, but I can’t find a plugin that simply limits tags by date. F.e. most popular tags today, this week, this month etc. Can anyone point me to it.
Thanks in advance.
-
Anyone?
<?php // get 20 latest posts, display the tags used on those posts $tag_array = array(); $args=array( 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => 20, 'caller_get_posts'=> 1 ); $my_query = null; $my_query = new WP_Query($args); if( $my_query->have_posts() ) { while ($my_query->have_posts()) : $my_query->the_post(); $tag_args=array('orderby' => 'none'); $tags = wp_get_post_terms( $post->ID , 'post_tag', $tag_args); foreach($tags as $tag) { $tag_array[$tag->term_id] = $tag->term_id; } endwhile; } if ($tag_array) { echo '<p>List of tags used on 20 latest posts</p>'; foreach($tag_array as $post_tag) { $tag = get_term_by('ID',$post_tag, 'post_tag'); echo '<p><a href="' . esc_attr(get_term_link($tag, 'category')) . '" title="' . sprintf( __( "View all posts in %s" ), $tag->name ) . '" ' . '>' . $tag->name.'</a><p> '; } } wp_reset_query(); // Restore global post data stomped by the_post(). ?>
Thanks for your reply and code Michael.
I’ve also found https://www.ads-software.com/extend/plugins/wp-recent-tags/ which is a very old plugin, but I took the plunge and tried it, and it still works…lol.
Is there a way to specify dates instead of the number of posts? (I’m monitoring a twitter stream and lots of post pass by…)
You’d need to look at the query_posts time parameters and use that with the above query.
Hmm…been trying all day, but I can’t make it work. For some reason it only displays 4 tags (while there are 100’s of tags). Can you point me in the right direction?
On a sidenote, orderby ‘count’ doesn’t seem to work and the tags link to a category instead of the tags itself. Your help is appreciated!
<?php $week = date('W'); $year = date('Y'); $recent = query_posts('year=' . $year .'&w=' .$week ); // get most popular tags for this week (limit by 25) $tag_array = array(); $args=array( 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => '$recent', 'caller_get_posts'=> 1 ); $my_query = null; $my_query = new WP_Query($args); if( $my_query->have_posts() ) { while ($my_query->have_posts()) : $my_query->the_post(); $tag_args=array('orderby' => 'count'); $tags = wp_get_post_terms( $post->ID , 'post_tag', $tag_args); foreach($tags as $tag) { $tag_array[$tag->term_id] = $tag->term_id; } endwhile; } if ($tag_array) { echo 'most popular this week'; foreach($tag_array as $post_tag) { $tag = get_term_by('ID',$post_tag, 'post_tag'); echo '<ul><li>'; echo '<a href="' . esc_attr(get_term_link($tag, 'category')) . '" title="' . sprintf( __( "View all posts in %s" ), $tag->name ) . '" ' . '>' . $tag->name.'</a> '; echo '</li></ul>'; } } wp_reset_query(); // Restore global post data stomped by the_post(). ?>
Maybe forget that and just use this for your loop (from the code above) for counting post tags in last 35 days
$mylimit=35 * 86400; // 35 days * seconds per day while ($my_query->have_posts()) : $my_query->the_post(); $post_age = date('U') - mysql2date('U', $post->post_date_gmt); if ($post_age < $mylimit) { $tag_args=array('orderby' => 'none'); $tags = wp_get_post_terms( $post->ID , 'post_tag', $tag_args); foreach($tags as $tag) { $tag_array[$tag->term_id] = $tag->term_id; } } endwhile;
Oke, I think I’m getting closer…
Now I have<?php // get 20 latest posts, display the tags used on those posts $tag_array = array(); $args=array( 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => -1, 'caller_get_posts'=> 1 ); $my_query = null; $my_query = new WP_Query($args); $mylimit=1 * 14400; // 35 days * seconds per day - modified this to last 4 hours while ($my_query->have_posts()) : $my_query->the_post(); $post_age = date('U') - mysql2date('U', $post->post_date_gmt); if ($post_age < $mylimit) { $tag_args=array('orderby' => 'count'); $tags = wp_get_post_terms( $post->ID , 'post_tag', $tag_args); foreach($tags as $tag) { $tag_array[$tag->term_id] = $tag->term_id; } } endwhile; if ($tag_array) { echo 'most popular tags of the last hours'; foreach($tag_array as $post_tag) { $tag = get_term_by('ID',$post_tag, 'post_tag'); echo '<ul><li>'; echo '<a href="' . esc_attr(get_term_link($tag, 'category')) . '" title="' . sprintf( __( "View all posts in %s" ), $tag->name ) . '" ' . '>' . $tag->name.'</a> '; echo '</li></ul>'; } } wp_reset_query(); // Restore global post data stomped by the_post(). ?>
However it itways seems to display by most recent as opposed to by most (count). And would it be possible the display the countnumber as well? And lastly, I can’t seem to modify the taglink, it links to a category (that doesn’t exist). To summarize ; what I’m trying to achieve is something like this:
Most popular tags of today
– Obama (18 mentions)
– New York (15 mentions)
– Iron Man (11 mentions)
– Robin Hood (7 mentions)
– MichaelH (5 mentions)Sorry to bother you this much.
This line
echo '<a href="' . esc_attr(get_term_link($tag, 'category')) . '" title="' . sprintf( __( "View all posts in %s" ), $tag->name ) . '" ' . '>' . $tag->name.'</a> ';
should be
echo '<a href="' . esc_attr(get_term_link($tag, 'post_tag')) . '" title="' . sprintf( __( "View all posts in %s" ), $tag->name ) . '" ' . '>' . $tag->name.'</a> ';
`
Thanks Michael, that worked beautifully. Any suggestions for my other questions?
However it itways seems to display by most recent as opposed to by most (count). And would it be possible the display the countnumber as well? To summarize ; what I’m trying to achieve is something like this:
Most popular tags of today
– Obama (18 mentions)
– New York (15 mentions)
– Iron Man (11 mentions)
– Robin Hood (7 mentions)
– MichaelH (5 mentions)I believe the count is in $tag->count but do you mean a count of the total posts in that tag, or just a count of the ‘most recent posts’. If it’s just the most recent posts you will need to store that count yourself.
If you want a terms list sorted by count (all posts, not just the recent posts) then you will want to look at using Function_Reference/get_terms. But will leave that for you or someone else to code ??
I indeed meant the number of times a tag has been mentioned in recent posts. Kind of like the ‘trending topics’ on Twitter.
I now have your code which gives tags for recent posts, but I can’t sort it by count. I found an old code to display the most popular tags in a dropdown by count, where I can’t filter it to the most recent posts and lastly I have the mod recent tags (https://www.ads-software.com/extend/plugins/wp-recent-tags/) which does best what I want, but it stopped working after a day, which isn’t weird considering it was written for an old version of WordPress.
I just can’t believe no one has a need for a ‘most popular tags of the day/week/month’ thingie.
Giving this another shot. Since I just found out WordPress.com uses the plugin I need,
https://en.wordpress.com/tags/ -> “This is a peek into what people on WordPress.com are talking about this very instant. It only includes recent activity, so it should change quite a bit over time. Click on any word to see the most recent posts under each tag or category.”
Anyone knows of something like for a non – hosted WordPress??
I just wrote this to display a tag cloud of all tags used within a certain date range of posts. It seems to be working correctly but I’m afraid it may be a resource hog – can you guys test it out and verify that the query is constructed correctly? Is there a way to do it better?
<?php // Set up the query $now = gmdate("Y-m-d H:i:s",time()); $datelimit = gmdate("Y-m-d H:i:s",gmmktime(date("H"), date("i"), date("s"), date("m")-1,date("d"),date("Y"))); $popterms = "SELECT $wpdb->terms.*, COUNT($wpdb->terms.term_id) as count FROM $wpdb->posts, $wpdb->term_relationships, $wpdb->term_taxonomy, $wpdb->terms WHERE $wpdb->posts.ID=$wpdb->term_relationships.object_id AND $wpdb->term_taxonomy.term_taxonomy_id=$wpdb->term_relationships.term_taxonomy_id AND $wpdb->term_taxonomy.term_id=$wpdb->terms.term_id AND post_status = 'publish' AND post_date < '$now' AND post_date > '$datelimit' AND $wpdb->term_taxonomy.taxonomy='post_tag' GROUP BY $wpdb->terms.term_id ORDER BY post_date DESC"; $terms = $wpdb->get_results($popterms); if($terms){ // Arguments for wp_generate_tag_cloud // See wp_tag_cloud (line 560): https://core.trac.www.ads-software.com/browser/trunk/wp-includes/category-template.php $args = array( 'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45, 'format' => 'flat', 'separator' => "\n", 'orderby' => 'name', 'order' => 'ASC', 'exclude' => '', 'include' => '', 'link' => 'view', 'taxonomy' => 'post_tag', 'echo' => true ); // Create links foreach ( $terms as $key => $tag ) { if ( 'edit' == $args['link'] ) $link = get_edit_tag_link( $tag->term_id, $args['taxonomy'] ); else $link = get_term_link( intval($tag->term_id), $args['taxonomy'] ); if ( is_wp_error( $link ) ) return false; $terms[ $key ]->link = $link; $terms[ $key ]->id = $tag->term_id; } // Generate cloud echo wp_generate_tag_cloud( $terms, $args ); } ?>
- The topic ‘Limit tags by date’ is closed to new replies.