Get an array of the number of post per year of a custom post type (Wordpress)

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.

Topic array wp-get-archives custom-post-types Wordpress

Category Web


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>';
print_r($posts_per_year);
echo '</pre>';

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

Array
(
    [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.

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.