Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I have a lot of posts/pages, and I would like to create a list in my sidebar, showing all of the years that I have created posts/pages in, so for instance, if I have 5 posts/pages that were spaced out over 5 years, from 2006 to 2011, each year having one post, I would like 2005, 2006, 2007, 2008, 2009, 2010 and 2011 to show as list items in the sidebar, as links to all of the posts/pages created that year.

Any idea of how I can achieve that?

Thanx in advance!

share|improve this question

2 Answers 2

up vote 1 down vote accepted

Not sure if there's a specific function for this as i didn't find anything with a quick search, but i went ahead and wrote a function to do the job, feel free to expand upon it or do whatever you like with it.

List year archives for published posts of a type

Code is provided "as is", do as you will with it.

function get_years_for_type( $type = 'post', $echo = false, $sep = '<br />' ) {
    global $wpdb, $wp_post_types;

    $type = '' == $type ? 'post' : $type;

    if( !isset( $wp_post_types[$type] ) )
        return;

    $q = $wpdb->get_col( $wpdb->prepare( "SELECT YEAR(post_date) as year FROM wp_posts WHERE post_type = %s AND post_status = 'publish' GROUP by year", $type ) );

    if( empty( $q ) )
        return;

    $y = array();
    foreach( $q as $year )
        $y[] = '<a href="' . get_year_link( $year ) . '">' . $year . '</a>';

    $y = implode( $sep, $y );

    if( $echo )
        echo $y;
    else
        return $y;
}

Example usage:

// Output list of years for pages
echo get_years_for_type( 'page' );
get_years_for_type( 'page', true ); 

// Output list of years for posts
echo get_years_for_type();
get_years_for_type( 'post', true ); 

// Storing the result in a variable
$var = get_years_for_type(); // post is assumed for type when none set

// Using an alternate seperator for the links
echo get_years_for_type( 'post', false, ' | ' );    
get_years_for_type( 'post', true, ' | ' );

Hope that helps..

share|improve this answer
    
Thank you so much for the effort! –  Odyss3us Feb 21 '11 at 13:50
    
You're welcome. :) –  t31os Feb 21 '11 at 14:00

There is decent native function wp_get_archives() for such, but unfortunately native archives widget doesn't use all of it and is limited to monthly archives.

Take a look at Widgets Reloaded plugin, it replaces native widgets with more configurable versions.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.