Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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:

<?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?

share|improve this question
    
Did you try COUNT(ID)? –  Andrew Bartel Apr 12 '13 at 20:29
    
I had not, but I just tried it and it didn't work still. –  Eckstein Apr 12 '13 at 20:36
add comment

3 Answers

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();
    ?>
share|improve this answer
    
Thanks @MichalMau for the valuable info! This was really helpful. –  Eckstein Apr 12 '13 at 22:27
add comment

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
) ) );
share|improve this answer
add comment

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'");
?>
share|improve this answer
    
Hmmm, still not doing it. Is there a better method than this? I literally copied and pasted the first snippet from another answer, so I'm open to alternative ideas if you have them. –  Eckstein Apr 12 '13 at 21:08
    
Put the whole query in a variable, die that out and take it to mysql workbench at this point then. I'd start with just Select * FROM wp_posts WHERE post_type = 'user_video', finding an author and then working backwards from there. Can you post what the query looks like here too after you echo it? –  Andrew Bartel Apr 12 '13 at 21:14
2  
@AndrewBartel It's easier to parse visually using this formatting. You only need prefix for non-standard tables and no need to concatenate the string if using double-quotes. –  brasofilo Apr 12 '13 at 21:40
    
Ah, thanks @brasofilo. Learn something new every day. –  Andrew Bartel Apr 12 '13 at 21:50
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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