it-swarm.com.de

Schließen Sie einen Begriff einer Taxonomie mit einem benutzerdefinierten Beitragstyp in einer Suche aus

Ich habe eine WooCommerce-Kategorie für verkaufte Artikel im benutzerdefinierten Post-Typ "Produkt" von WooCommerce. Was ich versuche, ist, dass die Website-Suche nur Ergebnisse des Produktposttyps zurückgibt, aber auch die Kategorie der verkauften Artikel ausschließt. Jeder Code, den ich finde, um Kategorien von der Suche auszuschließen, scheint nicht zu funktionieren, aber ich schätze, das liegt daran, dass es sich um eine Kategorie innerhalb eines CPT handelt.

Der Code, den ich zum Filtern von Suchanfragen habe, reicht bis zum Produkt-CPT (in 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;
};

Und der Code, den ich versucht habe, Kategorien auszuschließen:

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');

Irgendwelche Ideen?

EDIT: Auf Vorschlag von Ialocin habe ich auch versucht:

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

Das Problem bei Ihrem Ansatz ist, dass die Produktkategorie von woocommerces eine benutzerdefinierte Taxonomie mit dem Namen product_cat ist. Aber mit cat adressieren Sie die eingebaute Kategorie. Taxonomien können mit einer Steuerabfrage , vereinfachtes Beispiel unten, angesprochen werden:

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, ich habe Ihre bearbeitete Antwort genommen und, wie Pieter Goosen erwähnte, sichergestellt, dass es sich um ein Array in einem Array handelt und dem Codex entspricht. Endgültiger Arbeitscode:

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