(Revised to improve the wording)
Actually, you do not have to set the orderby
to post__in
for post__in
query to work. There’s no such limitation in WordPress and you’d only need to set 'orderby' => 'post__in'
when you want to sort the posts exactly in the same order as the post IDs in the post__in
parameter. 🙂
And the actual problem in your code, is that WordPress (or the WP_Query
class) doesn’t recognize your post__in
parameter because there is a trailing space inside the parameter name — PHP doesn’t automatically remove trailing spaces in array keys or even values, and so does WordPress (i.e. the spaces are preserved); so $args['post__in ']
(note the space) and $args['post__in']
are two different array items:
$args = array( 'post_type' => 'projects', 'post__in ' => $projectIDs, 'posts_per_page' => 3 );
And even in the var_dump()
output, you could quite clearly see the trailing space here:
["post__in "]=>
So the fix is simple: remove the space. And try again with your query, where you should see it now has the proper IN
clause:
AND wpKX_posts.ID IN (79,98,108)
And actually, you don’t need to manually add the indexes here:
//$projectIDs = array( [0] => 79, [1] => 98, [2] => 108 );
$projectIDs = array( 79, 98, 108 ); // no manual indexes; still would work fine