Filtering archives

So today I took a look at the massive list of archive links that has been steadily growing down the right-hand side of my blog since 2001. I like to have a list of links rather than the drop-down menu style, but even I had to admit that 8 years of monthly archives was getting a bit much.

So I’ve done a quick re-design. The current year’s worth of archives are now linked monthly, with the rest being links to the yearly pages, from which each year is linked monthly.

Well, I say “quick”, but it has taken a few hours I think. Firstly I had to figure out how to get a new widget on the side-bar, as I had forgotten. Then I had to figure out how to get the wp_get_archives function to do yearly and monthly output – again, not too difficult, as that was in the Codex.

But then I wanted the yearly list to miss out the current year. Hmm. How to do that? There’s no parameter for that. After a bit of digging around through the WordPress code, I learnt that you have to use a filter. The code for my filters eventually ended up looking like this -

function mist_thisyear_getarchives_where ($sql) {
global $mist_time;
$post = $posts[0];
if (is_year()) {
if (!isset($mist_time)) {
$mist_time = get_the_time('Y');
}
$sql=$sql . ' AND YEAR(post_date) = ' . $mist_time;
} else {
$sql=$sql . ' AND YEAR(post_date) = YEAR (CURRENT_DATE) ';
}
return $sql;
}

function mist_oldyears_getarchives_where ($sql) {
global $mist_time;
if (is_year()) {
if (!isset($mist_time)) {
$mist_time = get_the_time('Y');
}
$sql=$sql . ' AND YEAR(post_date) != ' . $mist_time;
} else {
$sql=$sql . ' AND YEAR(post_date) < YEAR (CURRENT_DATE) ';
}
return $sql;
}

And I then call the wp_get_archives function like this -


add_filter ('getarchives_where','mist_oldyears_getarchives_where');
wp_get_archives('type=yearly');
remove_filter ('getarchives_where','mist_oldyears_getarchives_where');

The various filters and bits of conditional code let me have different archive lists on the Archive and other pages. The strange bits around get_the_time are a hack, because otherwise the variable doesn’t seem to be quite right. Instead I have to set $mist_time in my Archive template, so that it gets the correct year from the WordPress loop.

I hope this may be of help to anyone trying to set up slightly different archive links.

This entry was posted in Blog, WordPress and tagged with , , , .
Bookmark the permalink.
You can follow any comments here with the RSS feed for this post.
Both comments and trackbacks are currently closed.

There are 2 comments on this entry -

  1. Posted April 15, 2009 at 8:24 pm | Permalink

    This has also been covered in a different way here

  2. Posted April 19, 2009 at 12:20 am | Permalink

    Cheers for the link. I was quite amazed to find that you couldn’t do this by default in WordPress. While your way works, I didn’t really like playing around with adding/removing filters inside the theme.