Why query_vars get altered in WP_Query Object?

Milo’s comment about pre_get_posts helped solve this issue for me. In my case the parent theme used the pre_get_posts action to explicitly set the post_type for all author pages. It wasn’t in the functions.php, but I was able to find it by searching the theme for instances of pre_get_posts. (I used grep -R "pre_get_posts" . -l from the command line to find the file.)

If you’re not using a child theme, you could potentially just delete the problematic function and its add_action().

If you are using a child theme, to maintain upgradability of the parent theme, you can use the remove_action function…

Problematic Action existing in Parent Theme:

function problematic_parent_action( &$query ) {
  if ($query->is_author) {
    $query->set( 'post_type', array( 'problematic_parent_post_type' ) );
  }
}
add_action( 'pre_get_posts', 'problematic_parent_action' );

Resolution added to Child Theme:

function remove_problematic_parent_action() {
  remove_action( 'pre_get_posts', 'problematic_parent_action' );
}
add_action( 'init', 'remove_problematic_parent_action');