Quando adicionei as desvantagens ao Codex, estava pensando principalmente em usar o filtro 'request' como uma alternativa para query_posts ().
Esse filtro só é executado para a consulta principal, de modo que resolve o problema com 'pre_get_posts', que é acionado para todas as consultas.
A desvantagem é que você não tem acesso a sinalizadores de consulta como is_single () etc.
Aqui está uma maneira de obter acesso a elas, sem fazer as consultas SQL:
function alter_the_query( $request ) {
$dummy_query = new WP_Query(); // the query isn't run if we don't pass any query vars
$dummy_query->parse_query( $request );
// this is the actual manipulation; do whatever you need here
if ( $dummy_query->is_home() )
$request['category_name'] = 'news';
return $request;
}
add_filter( 'request', 'alter_the_query' );