Get list of months with posts

Core can’t help you here. You’ll have to do a…

Custom Query

Here’s a save query, that I use on admin UI screens to get the total amounts of month with posts to use them in the custom pagination. Pay attention that I query not only for the published posts, but take into consideration that there might be some restriction set and apply it then.

$post_status = esc_attr( $_GET['post_status'] );
$post_status = in_array( $post_status, $GLOBALS['avail_post_stati'] )
    ? " AND post_status = {$post_status}"
    : 'all'
;
'all' === $post_status AND $post_status="";

$total_page_dates = $wpdb->get_results( $wpdb->prepare( "
    SELECT
        YEAR( post_date )  AS year,
        MONTH( post_date ) AS month,
        count( ID )        AS posts
    FROM {$wpdb->posts}
    WHERE
        post_type = %s
        %s
    GROUP BY
        YEAR( post_date ),
        MONTH( post_date )
    ORDER BY post_date
    ASC
", get_current_screen()->post_type, $post_status ) );

Result

You’ll then be able to inspect your result

// Inspect the result
var_dump( $total_page_dates );

Which might look like the following:

array (size=4)
  0 => 
    object(stdClass)[1847]
      public 'year' => string '2013' (length=4)
      public 'month' => string '6' (length=1)
      public 'posts' => string '19' (length=2)
  1 => 
    object(stdClass)[1846]
      public 'year' => string '2013' (length=4)
      public 'month' => string '7' (length=1)
      public 'posts' => string '17' (length=2)
  2 => 
    object(stdClass)[1845]
      public 'year' => string '2013' (length=4)
      public 'month' => string '8' (length=1)
      public 'posts' => string '8' (length=1)
  3 => 
    object(stdClass)[1844]
      public 'year' => string '2013' (length=4)
      public 'month' => string '9' (length=1)
      public 'posts' => string '2' (length=1)

You are then able to loop through it or simply grab the first or last array item to get the range. Counting – count( $total_page_dates ) – would tell you how many month you got, etc. Keep in mind that every array value is an object, so you have to access it like this

$posts_in_first_month = total_page_dates[0]->posts;