Je veux filtrer la recherche WordPress (ainsi que la liste des articles WordPress) sur 2 valeurs d'une taxonomie personnalisée.
J'ai essayé ce code, filtrant ma taxonomie personnalisée nommée "marque", en excluant 70 ou 67 identifiants (nb: dans mon back-office, les messages ne peuvent être classés dans un terme de ma taxonomie à la fois):
// Filtering on listing
function filtre_listes( $query ) {
if ( !is_admin() ) {
$query->set( 'marque', '-70,-67' );
}
return $query;
}
add_action( 'pre_get_posts', 'filtre_listes' );
// Filtering on searches
function filtre_recherches(&$query)
{
if ( $query->is_search && ( !is_admin() ) )
$query->set('marque', '-70,-67');
return $query;
}
add_action('parse_query', 'filtre_recherches');
Mais cela ne semble pas fonctionner. J'utilise WordPress 3.0.5.
Une idée ?
Merci beaucoup et désolé pour mon anglais approximatif!
Essayer
$tax_query = array(
'relation' => 'AND',
array(
'taxonomy' => 'marque',
'terms' => array( 70, 67 ),
'field' => 'term_id',
'operator' => 'NOT IN'
)
);
//turn it into a WP_Tax_Query object...
$tax_query = new WP_TaxQuery($tax_query);
$query->set("tax_query", $tax_query);
Vous pouvez empêcher les publications dans un terme de taxonomie d'apparaître dans les résultats de recherche, les listes d'archives, etc. en utilisant le hook incroyablement puissant pre_get_posts
.
Prenons l'exemple suivant placé dans le fichier functions.php
de votre thème:
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
// Exclude Terms by ID from Search and Archive Listings
if ( is_search() || is_tax( 'marque' ) ) {
$tax_query = array([
'taxonomy' => 'marque',
'field' => 'term_id',
'terms' => [ 67, 70 ],
'operator' => 'NOT IN',
]);
$query->set( 'tax_query', $tax_query );
}
}, 11, 1 );
Cette action empêchera vos termes (67, 70) dans la taxonomie donnée (marque) d'apparaître dans les résultats de recherche ou les listes d'archives.
Puisque l'objet $query
est passé par référence, il n'est pas nécessaire de déclarer des éléments globaux ou de renvoyer une valeur. Ainsi, toutes les modifications apportées à l'objet de l'intérieur de notre fonction sont immédiatement apportées à l'original.