In which I explain how to beautifully display enormous WordPress archives in a compact format

WordPress Wednesday: Huge Archives

WordPressAbout eight years ago I wrote a WordPress Wednesday post about the great Alistair Lattimore plugin Kottke Style Archives. Incredibly his plugin is still available and still works as a pretty good solution to compactly display a WordPress archives page containing thousands of links.

My only issues with this plugin — and it’s a minor one — is that if you go an entire month without posting anything, you’ll have a glaring hole in your archives list. It’s not a tragedy or anything, but it does kill the beautiful symmetry the plugin is supposed to achieve.

With a little bit of hacking, you can fix this. Below is the somewhat modified version of the core function in his plugin as I use it here on my site. You can drop this into your theme’s functions.php file or use it as a guide to hacking Alistair’s plugin on your own.

/*-----------------------------------------------------
dvg_theme_archives()
-----------------------------------------------------*/
if ( !function_exists( 'dvg_theme_archives' ) ) {
     function dvg_theme_archives( $month_separator = ' ' ){
		global $wpdb;
		$output	= '';
		$year	= '';
		$m		= 0;
	
		$sql = "
SELECT	DATE_FORMAT(post_date, '%Y') AS Year,
	DATE_FORMAT(post_date, '%m') AS Month
FROM		{$wpdb->posts}
WHERE	DATE_FORMAT(post_date, '%Y') <> '0000'
AND		post_status = 'publish'
AND		post_type = 'post' 
GROUP	BY DATE_FORMAT(post_date, '%Y'), DATE_FORMAT(post_date, '%m')
ORDER	BY DATE_FORMAT(post_date, '%Y') DESC, DATE_FORMAT(post_date, '%m') ASC;
";
	
		$months	= $wpdb->get_results($sql);
	
		if ( !empty( $months ) ){
			foreach ( $months as $month ){
				// Add in the year heading
				if ( $year != '' && $year != $month->Year ){
					if ( $m != 12 && ( $year != date('Y') ) ){
						for( $i = $m + 1; $i <= 12; $i++ ){
							$output .= $month_separator.date( 'M', mktime( 0, 0, 0, $i, 1, $year ) );
						}
					}
				}
				if ( ( $year == '' ) || ( $year != $month->Year ) ){
					if ( strlen( $output ) ){
						$output .= "<br>\n<strong><a href=\"" . home_url( '/' ) . $month->Year . "\">" . $month->Year . "</a>:</strong>  ";
						if ( $month->Month > 1 ){
							for( $i = 1; $i < $month->Month; $i++ ){
								$output .= date( 'M', mktime( 0, 0, 0, $i, 1, $month->Year ) ).$month_separator;
							}
						}
					}
					else{
						// this is the most recent year to be displayed
						$output .= "\n<strong><a href=\"" . home_url( '/' ) . $month->Year . "\">" . $month->Year . "</a>:</strong>  ";
					}
				}
	
				// Add in the monthly archive links
				if ( $year == $month->Year ) $output .= $month_separator;
				
				if ( $year == $month->Year && ( $m != ( $month->Month + 1 ) ) ){
					for( $i = $m + 1; $i < $month->Month; $i++ ){
						$output .= date( 'M', mktime( 0, 0, 0, $i, 1, $month->Year ) ).$month_separator;
					}
				}
				$output .= '<a href="' . get_month_link( $month->Year, $month->Month ) . '">' . date( 'M', mktime( 0, 0, 0, $month->Month, 1, $month->Year ) ) . '</a>';
				$year	= $month->Year;
				$m		= $month->Month;
			}
		}
		else{
			$output = "<p>None available</p>\n";
		}
		echo $output;
     }
}
2024-01-30: Broken links in this post have been removed and/or updated.

Post the first comment:

I'll never share your email address and it won't be published.

What Is This?

davidgagne.net is the personal weblog of me, David Vincent Gagne. I've been publishing here since 1999, which makes this one of the oldest continuously-updated websites on the Internet.

bartender.live

A few years ago I was trying to determine what cocktails I could make with the alcohol I had at home. I searched the App Store but couldn't find an app that would let me do that, so I built one.

Hemingway

You can read dozens of essays and articles and find hundreds of links to other sites with stories and information about Ernest Hemingway in The Hemingway Collection.