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;