I have a custom post type "news" in my Wordpress site. I am using Advanced Custom Fields plugin to add meta data to each post.

I want to create an array of news items as an archive:

    [January] => 5
    [January] => 20
    [February] => 10
    [April] => 30

I managed to get this working using:

    global $wpdb;
    $news = $wpdb->get_results(
        "SELECT wp_posts.post_date, COUNT(wp_posts.ID) as count
         FROM $wpdb->posts
         wp_posts.post_type = 'news' AND
         wp_posts.post_status = 'publish' AND
         wp_posts.post_date <= CURDATE() AND
         wp_posts.post_date >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)
         GROUP BY YEAR(wp_posts.post_date), MONTH(wp_posts.post_date)
         ORDER BY wp_posts.post_date DESC", 

    $archive = array();
    foreach ($news as $post):
        $year = date('Y', strtotime($post['post_date']));      
        $month = date('m', strtotime($post['post_date']));     
        $month_name = date('F', strtotime($post['post_date']));
        $post['url'] = 'NOT SURE ABOUT URL';
        $archive[$year][$month_name] = $post;

I need to be able to link to specific years and months using http://example.com/news/2012/ and http://example.com/news/2012/10/.

I tried using the plugin Custom Post Type Archives but when I goto /news/2012/ I get the standard news listing with no filter applied.

Here is my Custom Post Type Code

    'label' => 'News',
    'description' => 'Latest News',
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'capability_type' => 'post',
    'hierarchical' => true,
    'rewrite' => array('slug' => '','with_front' => '1'),
    'query_var' => true,
    'has_archive' => true,
    'menu_position' => 120,
    'menu_icon' => /assets/img/icon-custom.png
  • 2
    I assume you're already using the built in Posts post type for something else? This is really what posts are set up for - monthly/yearly archives, and will "just work" without having to do anything further. If you want the same behavior for a custom post type, you will unfortunately have to generate your own rewrite rules, which is not so simple. – Milo Jan 30 '13 at 16:59
  • Yes, posts is being used for blog posts currently. The news section is a custom post type. Do you have an example of the re-write rules I would need to use for year and month? – dclawson Jan 30 '13 at 17:11

Here's an example using add_rewrite_rule to handle years and months for a custom post type where news is the slug. Visit the Settings > Permalinks page in admin to flush rewrite rules after this is added. You could also put this in a plugin and flush rewrite rules on plugin activation.

function wpa83797_news_rewrite_rules(){



add_action( 'init', 'wpa83797_news_rewrite_rules' );
  • Thanks @Milo, I've applied the rewrite rules for this but when I access http://mysite.com/news/2012/ i get redirected to http://mysite.com/news/. Can't figure out what the problem is. I should probably mention that I am using Roots WP framework also. I've had a look through but can't find anything that would be causing this. – dclawson Jan 30 '13 at 17:38
  • Same happens when I goto: http://mysite.com/index.php?post_type=news&year=2012&monthnum=10 – dclawson Jan 30 '13 at 17:46
  • what does your post type registration code look like? try it in twentytwelve to determine if it's theme-related. – Milo Jan 30 '13 at 17:52
  • It' seems the issue is to do with the roots_nice_search_redirect function in WP Roots. I will amend this function and post the result here. Thank You Milo, your htaccess rules were correct. – dclawson Jan 30 '13 at 18:07

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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