Wordpress - WP_Query vs get_posts

The difference between get_posts & WP_Query

You can view get_posts() as a slimmed down WP_Query. In fact looking at the source:

//... prepares query array $r
$get_posts = new WP_Query;
return $get_posts->query($r);

get_posts() use WP_Query, but only returns an array of posts - nothing more. Furthermore it sets:

$r['no_found_rows'] = true;

Normally (by default with WP_Query object) - WordPress queries how many posts there are in total - even if you are only after the first 10. It does this so it can perform pagination. So get_posts() is actually (slightly) quicker (it also ignores sticky posts).

Which to use...

If you only need an array of posts, and don't need the query object -use get_posts(). Otherwise, if you do need the access to the query object methods, or pagination, or sticky posts at the top, you should use WP_Query.


One important thing to note is that get_posts() has a bunch of default arguments that new WP_Query() doesn't have, which include post_type and post_status. The function's defaults are configured to facilitate getting published posts. If you want something different, you'll need to pass in thos parameters explicitly, whereas with WP_Query() you wouldn't have to do that.

For example, if you want to get all posts, regardless of their post status, you would need to call: get_posts( array( "post_type" => 'any' ) ); (leaving "post_type" blank - or anything that empty() would evaluate to true will cause get_posts() to apply its default value of "publish").