I have a custom post type called "papers", and, to feed a chart, I need an array of the number of posts per year that have posts.

I've tried with wp_count_posts() but it just give me the total number of post types, and get_archives() is just to static, and I need to use specific information like the number of post per year.

Does anyone know how to do this? Hope you can help me.

1 Answer 1


I have created a basic example on how you could achieve this result.

// get all posts from our CPT no matter the status
$posts = get_posts([
    'post_type'      => 'papers', // based on the post type from your qeustion
    'post_status'    => 'all',
    'posts_per_page' => -1

// will contain all posts count by year
// every year will contain posts count by status (added as extra =])
$posts_per_year = [];

// start looping all our posts
foreach ($posts as $post) {
    // get the post created year
    $post_created_year = get_the_date('Y', $post);

    // check if year exists in our $posts_per_year
    // if it doesn't, add it
    if (!isset($posts_per_year[$post_created_year])) {
        // add the year, add the posts stauts with the initial amount 1 (count)
        $posts_per_year[$post_created_year] = [
            $post->post_status => 1
    // year already exists, "append" to that year the count
    } else {
        // check if stauts already exists in our year
        // if it exist, add + 1 to the count
        if (isset($posts_per_year[$post_created_year][$post->post_status])) {
            $posts_per_year[$post_created_year][$post->post_status] += 1;
        // it doesnt exist, add the post type to the year with the inital amount 1 (count)
        } else {
            $posts_per_year[$post_created_year][$post->post_status] = 1;

// this is for debugging, to see what our variable contains
// after the loop
echo '<pre>';
echo '</pre>';

In the site that I runed this code this was my result, using print_r

    [2021] => Array
            [publish] => 28
            [pending] => 1
            [draft] => 1
            [private] => 1

    [2020] => Array
            [trash] => 2

I have no idea how you want to output this but now you have a starting point with a visual representation of the final array, $posts_per_year, so you can do with it what ever you want.

  • Thank you so much!! I was looking for something like this. Just needed to output the public ones in a basic array form: array ([0]=> 28 [1]=>0 ) // using the data of your site. I think I have a little homework to do so i can get that output but feel free to help me if you have the time. THANKS AGAIN! I'll mark this as answered whatever your response turn out be. Sep 23, 2021 at 18:53
  • Don't worry! I just got it using array_column($posts_per_year, 'publish') . THANKS!! :D Sep 23, 2021 at 22:18

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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