web-dev-qa-db-fra.com

Exclure un terme d'une taxonomie avec un type d'article personnalisé dans une recherche

J'ai une catégorie WooCommerce pour les articles vendus dans le type de produit personnalisé de l'article WooCommerce. Ce que j'essaie de faire, c'est que la recherche sur le site ne renvoie que les résultats du type de publication du produit, mais exclue également la catégorie des articles vendus. Tout code que je semble trouver pour exclure des catégories de la recherche ne semble pas fonctionner, mais je suppose que c'est parce que c'est une catégorie dans un CPT.

Le code que j'ai pour filtrer les recherches jusqu'au produit CPT (dans functions.php):

function mySearchFilter($query) {
    $post_type = $_GET['type'];
    if (!$post_type) {
        $post_type = 'product';
    }
    if ($query->is_search) {
        $query->set('post_type', $post_type);
    };
    return $query;
};

Et le code que j'ai essayé d'exclure des catégories:

function remove_categories_wp_search($query) {
if ($query->is_search) {
    $query->set('cat','-247');
}
    return $query;
}
add_filter('pre_get_posts','remove_categories_wp_search');

Des idées?

EDIT: Selon la suggestion de ialocin, j'ai aussi essayé:

function wpse188669_pre_get_posts( $query ) {
    if ( 
        ! is_admin() 
        && $query->is_main_query() 
        && $query->is_search() 
    ) {
        // set your parameters according to
        // https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
        $tax_query = array(
            // likely what you are after
            'taxonomy' => 'sold-gallery',
            'operator' => 'NOT IN',
        );
        $query->set( 'tax_query', $tax_query );
  }
}
add_action( 'pre_get_posts', 'wpse188669_pre_get_posts' );
3
lotech

Le problème de votre approche est que la catégorie de produits woocommerces est une taxonomie personnalisée appelée product_cat. Mais avec cat, vous vous adressez à la catégorie intégrée. Les taxonomies peuvent être adressées avec une requête tax requête , exemple simplifié ci-dessous:

function wpse188669_pre_get_posts( $query ) {
    if ( 
        ! is_admin() 
        && $query->is_main_query() 
        && $query->is_search() 
    ) {
        $query->set( 'post_type', array( 'product' ) );
        // set your parameters according to
        // https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
        $tax_query = array(
            array(
                // likely what you are after
                'taxonomy' => 'product_cat',
                'field'    => 'slug',
                'terms'    => 'sold-gallery',
                'operator' => 'NOT IN',
            ),
        );
        $query->set( 'tax_query', $tax_query );
  }
}
add_action( 'pre_get_posts', 'wpse188669_pre_get_posts' );
4
Nicolai

iolocin, j’ai pris votre réponse corrigée et, comme le mentionnait Pieter Goosen, je me suis assuré qu’il s’agissait d’un tableau rangé dans un tableau et conforme au codex. Code de travail final:

function wpse188669_pre_get_posts( $query ) {
    if ( 
        ! is_admin() 
        && $query->is_main_query() 
        && $query->is_search() 
    ) {
        $tax_query = array(
            'post_type' => 'product',
            'tax_query' => array(
                array(
                    'taxonomy' => 'product_cat',
                    'field' => 'slug',
                    'terms' => 'sold-gallery',
                    'operator' => 'NOT IN',
                ),
            ),
        );
        $query->set( 'tax_query', $tax_query );
  }
}
add_action( 'pre_get_posts', 'wpse188669_pre_get_posts' );
1
lotech