UPDATE: I’ve changed templates since this was written. This stuff is still effective, it’s just not displayed here.
As you can see, I’ve gotten my “asides” in place here. Note that you’ll have to go to the main page to see them. I used to maintain something I called the “sideblog” that was over in the sidebar and had links to things I found interesting but that didn’t merit a full post. I’ve missed my sideblog but have also been contemplating something more integral. Matt’s asides are more of what I had in mind as people are able to comment on his asides, but the thing that I don’t like about them is that his tend to gather up between posts, such that you often have to scroll down to get to the meat. I wanted my asides to be more “quick takes” that are almost ephemeral, they don’t take up a lot of room, and they’re definitely subservient to the main content (as rich as it is
).
The solution that I’ve come up with accomplishes my goals. Now I can post to a separate category cunningly called “Asides”. These posts are not included in the posts that are displayed on the main page, or in the “Last Five Entries” in the sidebar, or in the “More Recent Entries” at the bottom of the index. They appear in groups of 3 (if there are enough, a condition that only exists now as I haven’t generated 9 asides to fill all the spaces) between main posts. As I add asides, they redistribute themselves between the posts so that the 3 most recent appear at the top of the index, the next three appear between the first and second posts and so on. People can comment on these asides and see how many comments exist on the aside. Going to the comments also shows that you can view the archives of asides. There’s even an RSS feed for people that want to subscribe to the nutty asides.
So, how was this done?
Fairly straightforward but with some customization of plugins. I started off with Scott Reilly’s Customizable Post Listings plugin. This is a plugin that makes it pretty easy to generate lists of posts in various ways. However, it didn’t have quite the functionality that I needed for a couple of things — I wanted to replace my plugin with his, so I needed it to be able to do the things I needed for my “Last Five Entries”, my “More Recent Entries”, and my Asides. Here are the things I added:
- Most importantly was the ability to exclude categories in post listings. This way I can leave my Asides posts out of the “Most Recent” lists. I want those lists reserved for “real” posts like this one. I have to be able to support multiple exclusions as well — my “Currently Reading” section is a separate exclusion all its own — so that required a bit of adjustment of the code.
- To support the lists I already had, I needed some additional format specifiers. I added specifiers for providing links to the category archives of posts and links to the comments section using the “fancy comments” text (ie. “No Comments”, “1 Comment”, “2 Comments”, etc.).
- For the asides I needed the ability to display the number of comments as a link to the comments sections.
- For the way I wanted to do asides, I needed to know the number of posts actually generated in the list. That way, I can accurately offset into the asides posts for the subsequent asides lists.
- In addition to these changes I wanted a way to track the most viewed post. Hence, I added a call to increment a new field in the posts table upon command, and now we can order by that field as well as have a format specifier to show the number of views of that post. It’s up to the user when to determine a post is “viewed”… insert it in the main loop and anytime the home page is looked at the posts on that page are determined to be “viewed”. I’m currently only defining a post as being viewed when the single entry page is viewed.
Installing the plugin
Scott may work some of this functionality into his plugin, but until then those of you wishing to have similar functionality can use my version of his plugin. Install as usual — unzip, stick file in your wp-content/plugins directory, activate from the WordPress control panel. Now, to get the view count functionality — and bear in mind that this is optional… if you never use the view_count orderby list type or try to use the %post_view_count% format specifier you’ll never have problems — you’ll need to update the database. Run the following MySQL command against your database.
ALTER TABLE wp_posts ADD post_view_count INT UNSIGNED NOT NULL
Now it’s up to you to decide how you want to have your posts tracked. Wherever you view a post you’re welcome to have that tracked… from within your index, from only the single post view page, it’s totally up to you. Insert the following code in the loop wherever you wish. The only requirement is that the global variable $post be available.
c2c_increment_post_view_count();
This simply increments the view count for the current post.
Getting a list of asides
An important note about asides. If you’re dealing with one category of exclusions, that’s pretty simple. WordPress supports one category of exclusions pretty handily with one simple change to the main index.php. Simply insert a line in the following location of the main index.php at your blog’s root. Note that it is the “$cat =…” line that we added.
/* Don't remove this line. */
$cat ="-27";
require('./wp-blog-header.php');
include(ABSPATH . '/wp-header.php');That tells WordPress to leave out all posts in the category whose ID is 27 from the main processing loop. It’s only when you want more that one category excluded that you’ll have trouble. To do that you have to modify WP itself. It’s not hard, but some people may be skittish. First, change that line to be a space-delimited list of categories preceded with dashes that you want excluded, like so:
/* Don't remove this line. */
$cat ="-27 -28";
require('./wp-blog-header.php');
include(ABSPATH . '/wp-header.php');Now, edit your $ROOT/wp-includes/classes.php.
You’re looking for the following code:
$q['cat'] = ''.urldecode($q['cat']).'';
$q['cat'] = addslashes_gpc($q['cat']);
if (stristr($q['cat'],'-')) {
// Note: if we have a negative, we ignore all the positives. It must
// always mean 'everything /except/ this one'. We should be able to do
// multiple negatives but we don't
$eq = '!=';
$andor = 'AND';
$q['cat'] = explode('-',$q['cat']);
$q['cat'] = intval($q['cat'][1]);
} else {
$eq = '=';
$andor = 'OR';
}
$join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) ";
$cat_array = explode(' ',$q['cat']);
$whichcat .= ' AND (category_id '.$eq.' '.intval($cat_array[0]);
$whichcat .= get_category_children($cat_array[0], ' '.$andor.' category_id '.$eq.' ');
for ($i = 1; $i < (count($cat_array)); $i = $i + 1) {
$whichcat .= ' '.$andor.' category_id '.$eq.' '.intval($cat_array[$i]);
$whichcat .= get_category_children($cat_array[$i], ' '.$andor.' category_id '.$eq.' ');
}
$whichcat .= ')';
if ($eq == '!=') {
$q['cat'] = '-'.$q['cat']; // Put back the knowledge that we are excluding a category.
}and we’re going to change it to this:
$q['cat'] = ''.urldecode($q['cat']).'';
$q['cat'] = addslashes_gpc($q['cat']);
if (stristr($q['cat'],'-')) {
// Note: if we have a negative, we ignore all the positives. It must
// always mean 'everything /except/ this one'. We should be able to do
// multiple negatives but we don't
$eq = '!=';
$andor = 'AND';
} else {
$eq = '=';
$andor = 'OR';
}
$join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) ";
$cat_array = explode(' ',$q['cat']);
$whichcat .= ' AND (category_id '.$eq.' '.abs(intval($cat_array[0]));
$whichcat .= get_category_children($cat_array[0], ' '.$andor.' category_id '.$eq.' ');
for ($i = 1; $i < (count($cat_array)); $i = $i + 1) {
$whichcat .= ' '.$andor.' category_id '.$eq.' '.abs(intval($cat_array[$i]));
$whichcat .= get_category_children($cat_array[$i], ' '.$andor.' category_id '.$eq.' ');
}
$whichcat .= ')';My asides are interspersed between main posts only on the index. Therefore, my list function invocation is in the main loop, right before any actual post output. Note that I keep track of the return value so as to be able to automatically increment through the asides. That way, for instance, if I ever choose to have a different number of posts on my front page the asides will be correctly handled as opposed to hard-coding any numbers in. The $asides_offset variable controls this and starts at zero before the invocation. Each time through the loop it is incremented by the number of posts actually processed and then passed as the offset parameter into the function. 27 is the category ID for my asides, so that is the only category I want in this list.
$asides_offset += c2c_get_recent_posts(
3, '<p>» %post_content% (%comments_count_url%)', '27',
'date','DESC',$asides_offset);My “Currently Reading” section on the main page is a separate case but similar to an aside. It’s not included in the main flow of posts and not included in various lists, just like the asides. For completeness’ sake, here’s that invocation. Note that 28 is the category for “Currently Reading”.
c2c_get_recent_posts( '1',"<p>%post_content%
(%comments_count_url%)</p>",'28');Customizable “recent posts” lists
Now for the sidebar “Five Most Recent” and the index’s “More Recent Entries” the syntax is slightly different. Here’s both of those calls, with the exclusions needed to leave out the asides and “Currently Reading” stuff. First the “Five Most Recent”. The most interesting thing about this invocation is the multiple category exclusions (the ‘-27 -28′ to exclude category numbers 27 and 28):
c2c_get_recent_posts('5',"<li>%post_URL%
%post_date%</li>",
'-27 -28','date','DESC',0,'F d,Y');Now for the slightly fancier “More Recent Entries”. Note that I’m excluding the same categories but using some different formatting options, all from one call. In this case I want to start my posts from the last post on the index, so I utilize the existing “$posts_per_page” variable which tells WP how many posts to display on the index. It handily doubles into the amount of posts to offset for the “Most Recent Entries”.
$comment_icon = '<img src="' . get_bloginfo('template_url') .
'/images/comments.gif">';
c2c_get_recent_posts( 9, '<p>%post_URL%<br />Posted on
%post_date% in %post_categories_url% | '.$comment_icon.'
%comments_fancy_url%</p>', '-27 -28', 'date','DESC',
$posts_per_page,'F d, Y' );The final invocation is for my “most viewed posts” list. The only thing different about this is the “order by” parameter. In this case I want to order by the “view_count” field in descending order, meaning that the most viewed post is listed first.
c2c_get_recent_posts('5',"<li>%post_URL% %post_date%</li>",'-27 -28','view_count','DESC',0,'F d,Y');
Hope this helps someone. Note that this post has been around for about a week in various stages, but with the code section screwups it was too ugly to post. It still isn’t perfect, but it’s better than nothing.
If you like it…
Please note, if you find this or any of my plugins useful and feel the need to express your appreciation, I accept donations with a difference. Click the banner below to learn more.





Beetle Blog » Blog Archive » Reading List Implementation Says:April 13th, 2005 at 11:08 am
[…] dpress Include Page Plugin »

ColdForged Says:April 11th, 2005 at 8:25 am
If it’s showing as text you didn’t put it in the right place. Here’s the entirety of my index.php. Note that this is the index.php that exists in your blog root, not in the theme directory.

April Says:April 10th, 2005 at 1:08 pm
I tried adding the $cat =”-27″; to my index.php file, but it shows up in writting on the corner of my page. I put it exactly where you said to put it too. I also downloaded your plug-in, and for some reason it’s still not working. Hmph. I’m not a programmer, but I’m quick to learn.

The Life of Me. » Archives » Spaghetti & Spam Says:April 10th, 2005 at 10:32 am
[…] ebar. Try saying that three times fast! I have been using, yet another ColdForged plug-in, Customizable Post Listings for quite sometime now, but I’v […]

MrHappyGoLucky Says:April 3rd, 2005 at 1:26 pm
Just a follow up. Coldforged help me figure out what was wrong with my hyperlinks not functioning. I was putting my asides in the Content section of the post instead of Excerpt.
Had I fully read the comments (I thought I did!) I would have seen this answered in comment #26. Doh!
So to recap: Be sure to post your asides in the Excerpt section of your post, not the Content section and the category exclusion codes goes in your ROOT/index.php, not your template index.php.
Thanks again CF.

MrHappyGoLucky Says:April 2nd, 2005 at 6:11 am
Doh, that fixed it right up. As far as filling up the asides, that’s no problem at all. I love those little fellas.
On the hyperlinks thing, what I was referring to is that if I link to something in an aside, the link won’t show up for some reason. You have to click on (more) to go to the actual post and then click the link.
I’m sure it’s something having to do with the excerpt feature or something, but I can’t seem to figure it out.
Thanks for the help!

ColdForged Says:April 1st, 2005 at 5:11 pm
Note that the category exclusion has to go in the main index.php in your blog root, not the theme one. It’ll go right before the
require('./wp-blog-header.php');line.That will happen until you have enough asides to fill in all of them. My best suggestion if it bugs you would be to either whip out some serious asides or reduce the number of posts displayed on the main page until you fill them out.
Don’t know what you mean there.

MrHappyGoLucky Says:April 1st, 2005 at 1:45 pm
Oh, and the hyperlinks aren’t working.

MrHappyGoLucky Says:April 1st, 2005 at 1:42 pm
Hrm. I’m very interested in this plugin, but for some reason my asides are still showing up as main posts and I’ve got a few empty aside blocks under some posts.
Confused!
My index is here
Lil’ help?

Denis de Bernardy Says:March 29th, 2005 at 3:05 pm
Coldforged,
Just curious, did you find a solution to your code block problem?
If not, suggestion:
set $maxcodeline_length
filter code blocks, line by line
for each line that is too long, do truncate procedure
truncate at last code keyword before 40 chars
e.g. in:
[some long condition…] && ( cond1 || cond2 )
truncate before ‘&&’ or ‘(’ or… etc
but not before or in the middle of ‘cond1′
make it clear the indented line is tabbed
might work (but might make VB code confusing)