Possible Duplicate:
When to use WP_query(), query_posts() and pre_get_posts
I just noticed today that the documentation for query_posts() mentions some “disadvantages” of using query_posts for altering the main Loop, notably: ’causes additional SQL queries’.
This seems to imply that there’s another way / a better way. Obviously there’s get_posts() and WP_Query for secondary loops, but I don’t see them as addressing the “disadvantages” listed in the Codex documentation.
I can see that by waiting until you’re in the template to run query_posts, WordPress has already run a query once and this is now a second query that clobbers the first one (the first one being basically ignored). This definitely DOES sound inefficient (though perhaps not a big deal, who knows?)
My question is: is there an alternative to query_posts that does NOT add “additional SQL queries” or is the Codex documentation simply deceiving?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
When I added the drawbacks to the Codex, I was mainly thinking of using the ‘request’ filter as an alternative to query_posts().
That filter is only run for the main query, so that solves the problem with ‘pre_get_posts’, which fires for every query.
The downside is that you don’t have access to query flags like is_single() etc.
Here’s one way you could get access to them, without actually doing the SQL queries:
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' );
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0