What is the most efficient way to determine which loop I’m in?
I have a few plugins that alter the query by hooking into various parts of WP_Query::get_posts()
, through the usual suspects, ie posts_where
, posts_join
, etc. I don’t want to effect every loop on every page though, so right now I’m running a debug_backtrace()
and checking for the existence of the main()
or query_posts()
function as necessary.
There has to be a more efficient way to identify the primary loop and sub-loops on each page. Something I keep missing when I pore over the query vars and other aspects of the request, something that’s unique to each one. How would you go about doing this?
Just a quick update that a new method
is_main_query()
has been introduced in WP 3.3.Example:
Resources:
If secondary loops are called properly (i.e. by not mucking with
query_posts()
, and by setting a variable$myloop
equal toget_posts()
ornew WP_Query
), then identifying said loop is as simple as referencing the variable.If you need to call a second loop from within the primary Loop, and you call
setup_postdata()
in the secondary loop, you may need to callwp_reset_query()
when you close your secondary loop, so that your template tags revert to applying to the primary Loop.