Display Random Posts from Specific Tags or Categories
Post #710 categorized as WordPress, last updated on Jul 13, 2009
Tagged with loops, plugins, tips, tricks, WordPress
When developing the colorful Quintessential Theme (opens in new tab), I initially planned on displaying five random posts from each of my most popular tags and categories in the super-slick sliding-panel sidebar. Because I am running an older version of WordPress, however, this task proved to be quite the educational experience.
In newer versions (from 2.5 I think) of WordPress, the query_posts() function enables users to display posts in random order using the orderby=rand parameter. This would have made my life easy, as I could have included the following code for each of my random post lists:
<ul class="random-posts">
<?php query_posts('tag=whatever&showposts=5&offset=0&orderby=rand'); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endwhile; endif; ?>
</ul>
This would have been great, but the random-post ordering doesn’t work for my particular version of WordPress. As it turns out, for older versions of WordPress that are missing the incredibly useful orderby=rand parameter for the query_posts() function, there is an unofficial plugin available in the WordPress Help Forums that imparts the orderby=rand functionality to the query_posts() function, thereby enabling users of pre-2.5 versions of WordPress to implement their own random post loops.
For those of you who would like to setup some random post loops on your own site, here’s how to do it in two easy steps. (Remember, this is only necessary if the above method does not work for your particular version of WordPress.)
Numero Uno: Upload and activate the plugin
Copy & paste the following code into a file named “random-posts.php” (or whatever), upload it to your /wp-plugins/ directory, and activate it via the Plugins panel in the WordPress Admin:
<?php
/*
Plugin Name: Random Posts Query
Description: Imparts random display functionality to posts generated via
query_posts in older versions of WordPress (especially great for version 2.3)
Author URI: http://wordpress.org/support/topic/70359?replies=3#post-444323
*/
// usage: include "random=true" as a parameter in your query_posts loop
function query_random_posts($query) {
return query_posts($query . '&random=true');
}
class RandomPosts {
function orderby($orderby) {
if (get_query_var('random') == 'true')
return "RAND()";
else
return $orderby;
}
function register_query_var($vars) {
$vars[] = 'random';
return $vars;
}
}
add_filter('posts_orderby', array('RandomPosts', 'orderby'));
add_filter('query_vars', array('RandomPosts', 'register_query_var'));
?>
Numero Dos: Include and customize the template code
Once the plugin is in place, create multiple tag-specific and category-specific random-post lists by placing the following code after the main loop in your theme template file (e.g., the sidebar.php file):
<ul class="random-posts">
<?php // use tag=whatever or category_name=whatever for cat/tag-specific posts ?>
<?php query_posts('tag=whatever&showposts=5&offset=0&random=true'); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endwhile; endif; ?>
</ul>
Before uploading, make sure you customize this code according to your needs. Old heads feel free to knock the boots, while newer chaps may benefit from the following information:
- As mentioned in the code comments, replace the “
tag=whatever” parameter with the name of the tag for which you would like to display random posts. - To display random posts from a specific category instead of a specific tag, simply replace the
tag=whateverparameter withcategory_name=whateverand change the name to your chosen category. - Adjust the other
query_postsparameters as needed to accomplish your post-display goals. For example, you may also want to display the post excerpt for each post item by including thethe_excerpt()tag. - Note that this code is essentially the same as that given for newer versions of WordPress; the only difference being that you use the
orderby=randparameter for newer versions of WordPress (where the plugin is not required), andrandom=truefor older versions (where the plugin is required). - Placing additional
query_posts()loops after the main loop may result in unintended paging and/or plugin issues, so make sure to place it after the main loop. - To create multiple lists of random posts, simply create multiple instance of this loop and change the category or tag parameter names to suit your needs.
Time to chill
That concludes this brief retro-tutorial. Although it may not be of much use to those treading the perpetual “upgrade” treadmill, it will hopefully provide some relief for randomizing posts in older WordPress versions.
Share this..
Related articles
- Add RSS Feed Link Icons to WordPress Category Listings
- Super Loop: Exclude Specific Categories and Display any Number of Posts
- Easily Adaptable WordPress Loop Templates
- Transfer Autometa Plugin Data into All in One SEO Pack
- Quickly Disable or Enable All WordPress Plugins via the Database
- WordPress Tip: Remove Spam from the Comment Subscription Manager
- 3 Ways to Exclude Content from WordPress Feeds
#1 — Teddy
Very handy tutorial, Jeff! I often forget the query_posts() function such that I use conditional tags in the post loop itself - which isn’t a very good thing, I know :) Now I can specify to display posts of certain tags or from certain categories without needing to use conditional tags. Oh, and I didn’t know that the older versions of WP lacks an orderby variable, it’s nice that you’ve given some thought to those who are still using the older version (although I’d personally recommend an upgrade, if they’ve hacked the WP inside out then, well, too bad :/ ).
You might also want to highlight that there should not be two loops on the same page - i.e. using the code in single.php and page.php, as far as I know (do correct me if I’m wrong, because I’m not that well-versed), will lead to conflict issues. This method is viable when it is used to modify the main page loop only. For other pages, it’s better to create a separate WP_query object and use it instead.
Here is an example, a verbatim lift from a helpful page in the WP codex:
<?php $my_query = new WP_Query('tag=whatever&showposts=5&offset=0&random=true'); ?><?php while ($my_query->have_posts()) : $my_query->the_post(); ?><!-- insert other codes here --><?php endwhile; ?>I hope I don’t sound too snooty or intrusive. I’m sorry if I sound so. I’m just trying to help, and that’s my 2 cents :)