web-dev-qa-db-fra.com

Le filtre de requête personnalisé ne fonctionne pas sur la page de catégorie woocommerce

J'essaie de créer un filtre personnalisé pour mon site Web woocommerce. Tout fonctionne correctement dans la page de la boutique, mais lorsque je vais à la page des archives, les filtres ne fonctionnent pas. J'enregistre chaque propriété de filtre dans l'adresse URL.

Le code de la page de la boutique fonctionne, mais dans la page des archives (catégorie), il ne fonctionne pas. Est-ce que quelqu'un sait comment manipuler la requête SQL dans la page d'archivage? Mon code actuel est:

function modify_query ($ query) {
 if (! is_admin () && $ query-> is_main_query () && $ query-> query_vars ['post_type'] == 'product') {
 if (isset ($ _ GET ["fillter"])) {
 $ arr [] = array (
 'taxonomy' => 'pc_filters', 
 'field' => ' term_id ', 
' terms '=> $ _GET ["fillter"], 
); 
 $ query-> set (' tax_query ', array (
 'relation' => 'AND', tableau 
 ($ arr) 
) 
); 
 return $ query; 
} 
} 
} 
 add_action ('pre_get_posts', 'modify_query');

Mais cela ne fonctionne que dans la page boutique.

2
Sky

À première vue, je ne suis pas sûr de savoir pourquoi cela ne fonctionne que sur votre page d'accueil et non sur vos pages d'archives, mais il y a quelques erreurs dans la façon dont cette fonction est écrite. Donc, je l'ai réécrit ci-dessous pour vous - en utilisant ceci à la place pourrait résoudre le problème s'il introduisait un bogue ésotérique auparavant.

Quelques points à noter:

  • relation ne doit pas être utilisé avec tax_query quand il n'y a qu'une seule requête interne ( reference )
  • votre tax_query avait une profondeur de trois tableaux - il ne devrait en être que deux
  • étant donné que pre_get_posts est une action, aucune valeur de retour n'est acceptée (dans ce cas, $query est transmis par la référence , il n'a donc pas besoin d'être renvoyé)
  • "filter" a été mal orthographié en tant que "fillter" (même si cela n'aurait pas cassé le code seul, il aurait pu vous confondre lors des tests si vous avez utilisé ?filter= dans votre chaîne de requête)
  • J'ai également ajouté la désinfection de la variable de chaîne de requête que vous apportez, par le biais de absint () étant donné qu'il s'agit d'un term_id

Cela dit, voici la fonction simplifiée:

function modify_query($query) {
  if( ! is_admin() && $query->is_main_query() && $query->query_vars['post_type'] == 'product') {
    if( isset( $_GET['filter'] ) ) {

      $query->set( 'tax_query', array (
        array(
          'taxonomy' => 'pc_filters',
          'field'    => 'term_id',
          'terms'    => absint( $_GET['filter'] ),
        )
      ));

    }
  }
}

add_action( 'pre_get_posts', 'modify_query' );

Je n'ai pas testé cela, mais il devrait faire ce que vous vouliez faire d'une manière un peu plus simple, ce qui pourrait résoudre votre problème.

Si cela ne résout pas le problème, cela peut être dû à la requête utilisée par WooCommerce sur les pages d'archivage, en particulier la valeur query_vars['post_type']. Les spécificités de WooCommerce sont hors sujet ici et je ne le connais pas vraiment moi-même, mais pour ce qui est de WordPress, vous pouvez utiliser print_r($query->query_vars); dans la fonction ci-dessus pour voir ce que vous devez utiliser, puis le modifier en conséquence. Vous pouvez également supprimer la vérification post_type complètement, bien que ce code s’applique également à vos publications générales et à vos pages, ce qui pourrait ne pas être ce que vous cherchez.

1
Tim Malone