» Who knew that Mister T was such a fashion maven? (0)

» "And right then," Knox said, "I heard, 'Excuse me, would it be OK if we carried her around and she touched each bag?'" Sportsmanship defined. (0)

» Web-based sequence diagram generator. Whoda thunk? Next thing you know you'll be able to buy stuff online. (0)

WordPress Asides, ColdForged-styleWordPress Asides, ColdForged-style

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 :D ).

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.

<?php 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>&raquo; %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%&lt;br />Posted on 
%post_date% in %post_categories_url% | '.$comment_icon.'&nbsp;
%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.

<?php 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.

Digg!

84 Responses to “WordPress Asides, ColdForged-style”

Pages: « 9 ... 5 4 3 2 [1] (Show All)

  1. 10

    trench Says:

    ColdForged, can you tell me what this actually does? Where did you stick this (<?php c2cincrementpostviewcount();?>) in your loop? Im getting all kinds of parse errors. I really want the asides menu you have. Thats what Im trying to accomplish here.

  2. 9

    Beetle Blog » Reading List Implementation Says:

    […] Reading List ImplementationThursday, Feb 24 2005  BloggingBrentlate evening ColdForged details how to use his version of Scott Reilly’ […]

  3. 8

    Jamin Says:

    Hi. I’m trying to get this working, but get the following error on the top of my index page:

    WordPress database error: [You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ‘ 3′ at line 1]
    SELECT DISTINCT * FROM wp_posts LEFT JOIN wppost2cat ON (wp_posts.ID = wp_post2cat.postid) WHERE wp_posts.post_date <= ‘2004-12-19 17:29:39′ AND ( wp_posts.post_status = ‘publish’ OR wp_posts.post_status = ’sticky’ ) AND wp_posts.post_password = ‘’ AND (category_id = 15)GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT , 3

    Then these lines inbetween posts:

    » $asides_offset += c2c_get_recent_posts( 3, ‘

    » %post_content% (%comments_count_url%)’, ‘27′, ‘date’,’DESC’,$asides_offset);

    As of now you can see the error for yourself on dcoi.endopsychosin.com.
    Any help would be appreciated, if you can find the time.

  4. 7

    AdamStac Says:

    Thanks ColdForged..I got this set up. I didn’t use the asides (yet), or More Recent Entries, but I used some other abilities of the plug-in. Thanks for the detailed walk-through! Very cool of you.

    Keep them coming…

  5. 6

    ColdForged Says:

    I’m no programmer, but after about two hours of trial and error I got this to work under Kubrick 1.2.6 Thank you.

    Excellent, glad you found it useful!

    The only problem I have found is that placing $cat=”-27”; in the specified line tosses out the setting for number of posts to show on the main page.

    I went ahead and answered this on the Flickr page.

  6. 5

    Michael Says:

    I’m no programmer, but after about two hours of trial and error I got this to work under Kubrick 1.2.6 Thank you. The only problem I have found is that placing $cat=”-27″; in the specified line tosses out the setting for number of posts to show on the main page. I have put it in an taken it out. Sure enough the minute I put it in every post I have ever made gets called when you hit my main page. I am new to blogging so it is only 30 or so - but any idea on how to correct this. Everything else is per you spec.

    Thanks so much!

  7. 4

    Silent Corner &raquo; Marvel On Crack Says:

    der: Gaming &#8212; Mike @ 1:16 pm I&#8217;m starting to think I need a version of ColdForged&#8217;s asides plugin&#8230; Am I the only one that& […]

  8. 3

    ColdForged Says:

    Good code blocks are tough. It’s part of the reason I made my wordpress layout non-fixed. But also because I haven’t had any time to mess with my blog in ages. If you find any good code block code, I’ll probably steal it from ya.

    This is as close as I’ve come, and it’s still not quite perfect for some things. the php prefix (e.g. <?php) doesn’t take kindly to being in there and I have to diddle with the break tags (<br />) to get them to display instead of be acted upon. The only thing left is line wrapped to my maximum width. That’s trickier than it should be, since if I’m, for instance, in an inline comment and want to wrap the line I have to indent and start a new inline comment. Blech.

    The asides are nice. I was kinda wondering what you had going there. At first I thought they might have been small tidbits related to the article before or after them but they didn’t make sense.

    Thanks! Yeah, perhaps interspersed as they are they’re a bit confusing. I’m happy with them but am open to improvements or ideas for making them less confusing. Perhaps some “asides” designator would help.

  9. 2

    Mike Says:

    Good code blocks are tough. It’s part of the reason I made my wordpress layout non-fixed. But also because I haven’t had any time to mess with my blog in ages. If you find any good code block code, I’ll probably steal it from ya. :)

    The asides are nice. I was kinda wondering what you had going there. At first I thought they might have been small tidbits related to the article before or after them but they didn’t make sense. :P

  10. 1

    ColdForged Says:

    Sigh Now if only someone could tell me how to get good <code> sections I’d be set. That’s the best I could manage though.

Pages: « 9 ... 5 4 3 2 [1] (Show All)

Leave a Reply

How do I get a cool icon like yours? Obviously "cool" is subjective, but you can have your own icon displayed here by signing up for a gravatar. Note that I currently accept up to an R-rated icon though that may change in the future.

You may use Markdown syntax in your comments.

Name

Mail (never published)

Website

In order to comply with COPPA and cover my own ass, you must be 13 or older to post a comment here. Period, no exceptions.

Comment Preview

  1. 85

    Someone Says: