I have create an endpoint so I can do some checkout processing of my cart. Everything is working fine in sense that every thing is hooked up properly. Though I am having issue that to serve the content of my endpoint, I define the_posts filter, where if my "endpoint" is choosen than I check other query_vars and do the processing. It works for me for couple of project.

However in this project, I need to mark my cart as paid and remove it from session. So, as usual under my the_posts filter/action function I define a switch and do the processing. But, when said page is called, cart was not getting marked. I debug and found that the_posts action function was called thrice on my page. and the first call did get it marked and clear session, but next call didn't find session value and hence it unmark the cart again.

the three call I have on my page are

  1. From wordpress URL rewrite module [I am guessing this] that it try to pick content or redirect them? [seems like a main_query as well]

  2. I have a custom post type as news that I show in my side header for this I create a new WP_query object, but it still call the_post as it is in header.

  3. My page content call where I actually needed it.

  4. I have another call that is in footer recent post thing. but it doesn't matter for my purpose.

in my the_post method I check for Query_var

global $wp_query, $wpdb, $cardcomm;
if(isset($wp_query->query_vars[cardcomendpoint]) ) { ... }

since all four call set this query var as true I am not sure how can I ensure that it is called for my purpose only. Any idea how to tackle this?

  • do you have ajax calls on the page.. – Sisir Mar 31 '14 at 8:34
  • no, I don't have ajax call, just couple of wp_query to show news and article like stuff. – Sumit Gupta Mar 31 '14 at 8:40

'the_posts' is an action fired everytime WP_Query get posts, for main query and for other secondary queries, so when you do something like:

$foo = new WP_Query($args);

in a widget or elsewhere (shortcode, related posts...) 'the_posts' is triggered again.

However there is only one main query, so you can use a conditional and do what you do only if the query that trigger the action is the main.

Luckily 'the_posts' pass to hooked functions the query object so you can check if is the main using WP_Query::is_main_query() method:

add_action('the_posts', 'check_my_endpoint', 10, 2);

function check_my_endpoint( $posts, $wp_query ) {

  if ( $wp_query->is_main_query() ) {

    global $wpdb, $cardcomm; // no need to globalize $wp_query, we have a reference to it

    if( isset( $wp_query->query_vars[cardcomendpoint]) ) { ... }


  • thanks that seems promising, but still I have question: what if instead of WP_query some one is using query_post()? I think that still mark it as main query, isn't it? I am asking this because client might add some plugin that use query_posts so if that happens it might break my query? – Sumit Gupta Mar 31 '14 at 10:40
  • @SumitGupta yes, query_posts will break that, but query_posts is considered a bad practice actually and is not you fault. However, I don't know your code, but maybe you can use a hook that is fired only once, like template_redirect – gmazzap Mar 31 '14 at 10:52
  • You are right, I can use template redirect more over most professional plugin doesn't use query_post anyways. so it is safe bet for me for now. – Sumit Gupta Mar 31 '14 at 10:58
  • this has been annoying me so much i was thinking that i had screwed up my site somehow as yoast was causing the_posts to get called many times. At least now i know its not a big deal – user1889580 Apr 26 '16 at 10:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.