Recent posts on homepage: different thumbnail based on logged in status and post category

If you want to use the the_ functions (e.g. the_permalink() and the_title()) and including in_category() (without specifying the second parameter) outside of The Loop (the standard one which calls the_post()), you should access the global $post variable and call setup_postdata() to set up global post data and after your foreach ends, call wp_reset_postdata() to restore the $post back to the current post in the main query.

You also must rename the $post_item variable to $post and I’d also use OBJECT as the second parameter value for wp_get_recent_posts(), although you could actually do setup_postdata( (object) $post ).

Working Example

$recent_posts = wp_get_recent_posts( array(
    'numberposts' => 6,        // Number of recent posts to display
    'post_status' => 'publish' // Show only the published posts
), OBJECT );  // 1. Set the second parameter to OBJECT.

global $post; // 2. Access the global $post variable.
foreach ( $recent_posts as $post ) : // 3. Rename $post_item to $post
    setup_postdata( $post );         // 4. Set up global post data.

    // ... your code here ..
    echo ( in_category( 'members' ) ? 'In' : '<b>Not</b> in' ) . ' Members category';
    the_title( '<h3>', '</h3>' );
endforeach;

wp_reset_postdata(); // 5. Restore the $post variable.

Remember, you need to change the $post_item in your code to $post and use the “arrow” to access the post data, e.g. $post->ID and not $post['ID']! 🙂