Get count of custom post type created by current user

I’m trying to get the count of published posts in a custom post type for the current user (to display on a profile page).

I found this here on the forums:

Read More
<?php
global $wp_query;
$curauth = $wp_query->get_queried_object();
$post_count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_author = '" . $curauth->ID . "' AND post_type = 'user_video' AND post_status = 'publish'");
?>

But, it’s just giving me a big fat ZERO even though there are definitely published posts of that type. What am I doing wrong and is there a better way to do this?

Related posts

Leave a Reply

6 comments

  1. I’m posting a new answer because I found this thread while searching for the same thing and the solutions here weren’t optimal.

    The post_type argument can be a string or an array of post types.

    function custom_count_posts_by_author($user_id, $post_type = array('post', 'page', 'custom_post_type'))
    {
        $args = array(
            'post_type'      => $post_type,
            'author'         => $user_id,
            'post_status'    => 'publish',
            'posts_per_page' => -1
        );
    
        $query = new WP_Query($args);
    
        return $query->found_posts;
    }
    
  2. I would suggest using get_posts() instead of query_posts() for your purpose.

    To create secondary listings (for example, a list of related posts at the bottom of the page, or a list of links in a sidebar widget), try making a new instance of WP_Query or use get_posts(). [source]

    It also looks simpler now 🙂

    echo count( get_posts( array( 
        'post_type' => 'user_video', 
        'author'    => get_current_user_id(), 
        'nopaging'  => true, // display all posts
    ) ) );
    
  3. OK, after more Googleing, this seems to work without having to use MySQL and dive into the database directly:

    <?php 
            $authorid = get_current_user_id();
            query_posts(array( 
                'post_type' => 'user_video',
                'author' => $authorid,
            ) ); 
                $count = 0;
                while (have_posts()) : the_post(); 
                    $count++; 
                endwhile;
                echo $count;
            wp_reset_query();
        ?>
    
  4. In authors profile for me works great this (ait-dir-item is custom post type name)

    <?php  
    $idecko = get_the_author_meta( 'ID' );
    echo count_user_posts( $idecko, 'ait-dir-item' ); ?>     
    
  5. You need to declare $wpdb as global as well, and use its prefix method.

    <?php
    global $wp_query, $wpdb;
    $curauth = $wp_query->get_queried_object();
    $post_count = $wpdb->get_var("SELECT COUNT(ID) FROM ".$wpdb->prefix."posts WHERE post_author = '" . $curauth->ID . "' AND post_type = 'user_video' AND post_status = 'publish'");
    ?>