J'essaie de modifier les fonctionnalités de recherche d'un magasin WooCommerce. Ainsi, lorsqu'un utilisateur effectue une requête qui correspond à un slug product_tag
, il renvoie les produits auxquels aucune balise n'est attribuée.
La logique derrière ceci montre tous les produits sans gluten à un utilisateur qui recherche le "gluten".
Mon code fonctionne presque sauf pour le paramètre opérateur.
Je lance cette requête:
http://example.com/?s=gluten
Cette fonction renvoie tous les produits marqués comme requête de recherche:
function menta_pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
$term = get_term_by('slug', get_query_var('s'), 'product_tag');
if ( $term && !is_wp_error( $term ) ) {
$tax_query = array(
'taxonomy' => 'product_tag',
'field' => 'slug',
'terms' => $term->slug,
'operator' => 'IN'
);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
}
}}
add_action( 'pre_get_posts', 'menta_pre_get_posts', 1 );
Mais si je change l'opérateur en NOT IN, je n'obtiens aucun résultat:
function menta_pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
$term = get_term_by('slug', get_query_var('s'), 'product_tag');
if ( $term && !is_wp_error( $term ) ) {
$tax_query = array(
'taxonomy' => 'product_tag',
'field' => 'slug',
'terms' => $term->slug,
'operator' => 'NOT IN'
);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
}
}}
add_action( 'pre_get_posts', 'menta_pre_get_posts', 1 );
Les produits sont correctement étiquetés et il existe des produits sans l’étiquette gluten
Je suppose que vous avez besoin d’un tableau pour les termes - bien que je ne sache pas pourquoi cela fonctionnerait avec "IN" et non avec "NOT IN" ... Mais j’essaierais ceci:
function menta_pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
$term = get_term_by('slug', get_query_var('s'), 'product_tag');
if ( $term && !is_wp_error( $term ) ) {
$tax_query = array(
'taxonomy' => 'product_tag',
'field' => 'slug',
'terms' => array($term->slug),
'operator' => 'NOT IN'
);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
$query->set('tax_query', $query->tax_query->queries);
}
}}
add_action( 'pre_get_posts', 'menta_pre_get_posts', 1 );
J'espère que cela t'aides!