wp_count_posts( string $type = 'post', string $perm = '' )

Count number of posts of a post type and if user has permissions to view.

Description Description

This function provides an efficient method of finding the amount of post’s type a blog has. Another method is to count the amount of items in get_posts(), but that method has a lot of overhead with doing so. Therefore, when developing for 2.5+, use this function instead.

The $perm parameter checks for ‘readable’ value and if the user can read private posts, it will display that for the user that is signed in.

Parameters Parameters


(string) (Optional) Post type to retrieve count.

Default value: 'post'


(string) (Optional) 'readable' or empty.

Default value: ''

Top ↑

Return Return

(object) Number of posts for each status.

Top ↑

Source Source

File: wp-includes/post.php

function wp_count_posts( $type = 'post', $perm = '' ) {
	global $wpdb;

	if ( ! post_type_exists( $type ) )
		return new stdClass;

	$cache_key = _count_posts_cache_key( $type, $perm );

	$counts = wp_cache_get( $cache_key, 'counts' );
	if ( false !== $counts ) {
		/** This filter is documented in wp-includes/post.php */
		return apply_filters( 'wp_count_posts', $counts, $type, $perm );

	$query = "SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s";
	if ( 'readable' == $perm && is_user_logged_in() ) {
		$post_type_object = get_post_type_object($type);
		if ( ! current_user_can( $post_type_object->cap->read_private_posts ) ) {
			$query .= $wpdb->prepare( " AND (post_status != 'private' OR ( post_author = %d AND post_status = 'private' ))",
	$query .= ' GROUP BY post_status';

	$results = (array) $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A );
	$counts = array_fill_keys( get_post_stati(), 0 );

	foreach ( $results as $row ) {
		$counts[ $row['post_status'] ] = $row['num_posts'];

	$counts = (object) $counts;
	wp_cache_set( $cache_key, $counts, 'counts' );

	 * Modify returned post counts by status for the current post type.
	 * @since 3.7.0
	 * @param object $counts An object containing the current post_type's post
	 *                       counts by status.
	 * @param string $type   Post type.
	 * @param string $perm   The permission to determine if the posts are 'readable'
	 *                       by the current user.
	return apply_filters( 'wp_count_posts', $counts, $type, $perm );

Top ↑

Changelog Changelog

Version Description
2.5.0 Introduced.

Top ↑

User Contributed Notes User Contributed Notes

  1. Skip to note content
    Contributed by Codex

    Get the Publish Status Post Count

    To get the published status type, you would call the wp_count_posts() function and then access the ‘publish’ property.

    $count_posts = wp_count_posts();
    if ( $count_oosts ) {
    	$published_posts = $count_posts->publish;

    If you are developing for PHP5 only, then you can use shorthand, if you only want to get one status. This will not work in PHP4 and if you want to maintain backwards compatibility, then you must use the above code.

    $published_posts = wp_count_posts()->publish;

You must log in before being able to contribute a note or feedback.