It’s quite some time since I worked with WordPress, but it seems to me that:
You’re executing the query twice.
-
First when you pass
$args
to the constructor during instantiation. -
Second when you call
query()
.
With this, you’re essentially overwriting the first query (the one that contains the orderby=rand).
The documentation of WP_Query mentions that get_posts()
is called if you use a parameter in the constructor, and it shouldn’t be called twice:
&get_posts() – Fetch and return the requested posts from the database.
Also populate $posts and $post_count. Note: This is called during
construction if WP_Query is constructed with arguments. It is not
idempotent and should not be called more than once on the same query
object. Doing so may result in a broken query.
And the query()
method’s documentation states that it calls get_posts()
, therefore it’s called twice:
&query( $query ) – Call parse_query() and get_posts(). Return the
results of get_posts().
The solution:
- You should either put everything in
$args
, or - add the
orderby
parameter too to the$wp_query->query(..)
call.