Count user posts by user ID, Post type and Post status

What I am trying to do is modification of this function on codex Check the title adding post type support bottom of the page. The function is:

function count_user_posts_by_type($userid, $post_type='post') {
  global $wpdb;
  $where = get_posts_by_author_sql($post_type, TRUE, $userid);
  $count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );
  return apply_filters('get_usernumposts', $count, $userid);

What I want is to add post status to the function. So, I assume I have to add a WHERE to the query but not sure how to do it. Any help will be appreciated.


Solutions Collecting From Web of "Count user posts by user ID, Post type and Post status"

Here is a quick solution to get the post count any kind of filtering you want

function custom_get_user_posts_count($user_id,$args );  
    $args['author'] = $user;
    $args['fields'] = 'ids';
    $ps = get_posts($args);
    return count($ps);

Since this function uses get_posts you can filter and use anything that you can with WP_Query

So in your case you can use it like this:

$count = custom_get_user_posts_count($user_id, array(
    'post_type' =>'post',
    'post_status'=> 'draft'

Here is a custom function I’ve cooked up, which allows you to query by post type and post status for a particular author. You may need to be careful what arguments you pass as it can include auto-drafts and revisions…

The following is adapted from the get_posts_by_author_sql

function my_count_posts_by_user($post_author=null,$post_type=array(),$post_status=array()) {
    global $wpdb;

        return 0;

    $post_status = (array) $post_status;
    $post_type = (array) $post_type;

    $sql = $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->posts WHERE post_author = %d AND ", $post_author );

    //Post status
        $argtype = array_fill(0, count($post_status), '%s');
        $where = "(post_status=".implode( " OR post_status=", $argtype).') AND ';
        $sql .= $wpdb->prepare($where,$post_status);

    //Post type
        $argtype = array_fill(0, count($post_type), '%s');
        $where = "(post_type=".implode( " OR post_type=", $argtype).') AND ';
        $sql .= $wpdb->prepare($where,$post_type);

    $sql .='1=1';
    $count = $wpdb->get_var($sql);
    return $count;