pre_get_posts conflict with archive posts

As your pre_get_posts function stands, you’ll have that conflict as you are using pre_get_posts very carelessly.

pre_get_posts modifies the query variable object before the main query AND WP_Query is executed. So any changes in your function will influence both the main query and any custom query that uses WP_Query. That is why everything is haywire in your forum pages as well, as you are adding these changes to your forum as well

Secondly, when working with any type of archive query (is_archive(), is_category() etc), any changes made with pre_get_posts will also affect the back end

So, your solution would be to run pre_get_posts only on the main query (is_main_query()), and also just in the front end (!is_admin())

Something like this will do

if( !is_admin() && $query->is_main_query() && $query->is_archive() );

EDIT

I’m not going to change my code above. Only realized your code is for author page. Then you should be using is_author(), not is_archive()