wp_reset_query
is meant to be used with a loop, because it resets the global $wp_query
object. get_posts
, on the other hand, just returns an array to be iterated with ie. foreach
. setup_postdata
does not populate the $wp_query
object: https://codex.wordpress.org/Function_Reference/setup_postdata.
For a custom query, you would either use the WP_Query
class, or you could reset your posts array using standard PHP functions like reset.
https://codex.wordpress.org/Function_Reference/wp_reset_query