I have read a number of questions on SE regarding these but I still can’t figure the exact difference wrt usage. Would it be true to say that I would probably use WP_Query for the majority of secondary loops and only use get_posts if I need the results returned in an array, or to put it another way is the main difference between the two the array vs object return, or is there some other major factor I should be aware of?
Leave a Reply
You must be logged in to post a comment.
The difference between get_posts & WP_Query
You can view
get_posts()
as a slimmed downWP_Query
. In fact looking at the source:get_posts()
useWP_Query
, but only returns an array of posts – nothing more. Furthermore it sets: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. Soget_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 useWP_Query
.One important thing to note is that
get_posts()
has a bunch of default arguments thatnew WP_Query()
doesn’t have, which includepost_type
andpost_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 withWP_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 thatempty()
would evaluate totrue
will causeget_posts()
to apply its default value of “publish”).