Turns out that it is possible to run a WP_Query inside a pre_get_posts action keeping in mind two simple principles:
-
pre_get_postsaction will alter every query that you make, so you need to contain its action specifying which queries you need to alter. In this case, this containment is done with this line:if ( is_admin() and !current_user_can('manage_options') and $screen->post_type == 'page' ) { ... }This means that I’m altering only the query that happens when you load
edit.php?post_type=pagein Administration Panel. -
Because of the former,
pre_get_postswill alter the main query of the page, which is “query all pages“. My question attempted to run aWP_Queryinside an action that alters every query, so this action was also altering my “sub-queries”. So, as the first principle tells us, we need to contain the action to act only on the main query, because if we don’t contain it, we’ll get an infinite loop. So, our “containment” line needs to know if what we’re altering is actually the main query:if ( is_admin() and !current_user_can('manage_options') and $screen->post_type == 'page' and $query->is_main_query() // This contains only the main query ) { ... }So now we can run whatever
WP_Querywe want in theget_dummy_pages()function.