web-dev-qa-db-fra.com

Comment filtrer la recherche WordPress, excluant post dans certaines taxonomies personnalisées?

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!

2
Cédric G

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);
1
Chris Carson

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.

0
rjb