web-dev-qa-db-fra.com

le filtre the_posts a été appelé plusieurs fois

J'ai créé un point de terminaison pour pouvoir effectuer le traitement de mon panier à la caisse. Tout fonctionne bien dans le sens où tout est connecté correctement. Bien que je ne rencontre pas de problème pour servir le contenu de mon noeud final, je définis le filtre the_posts, où, si mon "noeud final" est choisi, je vérifie les autres query_vars et effectue le traitement. Cela fonctionne pour moi pour un couple de projet.

Cependant, dans ce projet, je dois marquer mon panier comme payé et le retirer de la session. Donc, comme d'habitude sous ma fonction de filtre/action the_posts, je définis un commutateur et effectue le traitement. Mais, lorsque cette page a été appelée, le panier n'était pas marqué. Je débogue et trouve que la fonction d'action the_posts a été appelée trois fois sur ma page. et le premier appel a été marqué et effacé de la session, mais le prochain appel n'a pas trouvé la valeur de la session et par conséquent il a annulé à nouveau le panier.

les trois appels que j'ai sur ma page sont

  1. Du module de réécriture d'URL wordpress [je devine ceci] qu'il essaye de choisir le contenu ou de le rediriger? [semble être aussi une main_query]

  2. J'ai un type de publication personnalisé en tant que nouvelle que je montre dans l'en-tête de mon côté. Je crée un nouvel objet WP_query, mais il appelle toujours the_post tel qu'il est dans l'en-tête.

  3. Mon appel de contenu de page où j'en avais réellement besoin.

  4. J'ai un autre appel en bas de page post récent. mais cela n'a pas d'importance pour mon but.

dans ma méthode the_post, je vérifie Query_var

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

comme les quatre appels définissent cette requête comme étant vraie, je ne suis pas sûr de savoir comment puis-je m'assurer qu'il est appelé uniquement pour mes besoins. Une idée de comment aborder cela?

1
Sumit Gupta

'the_posts' est une action déclenchée à chaque fois WP_Query get posts, pour la requête principale et pour les autres requêtes secondaires, donc lorsque vous faites quelque chose comme:

$foo = new WP_Query($args);

dans un widget ou ailleurs (shortcode, publications connexes ...) 'the_posts' est à nouveau déclenché.

Cependant, comme il n’existe qu’une seule requête principale, vous pouvez utiliser une condition et ne faire ce que vous faites que si la requête qui déclenche l’action est la requête principale.

Heureusement, 'the_posts' passe à l'objet lié de la requête afin que vous puissiez vérifier s'il s'agit de la méthode principale utilisant la méthode WP_Query::is_main_query():

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]) ) { ... }

  }

}
5
gmazzap