Wie ändert man die Abfrage mit pre_get_posts hook und is_post_type_archive?

Die Notwendigkeit: Ich versuche, ein benutzerdefiniertes Post-Archiv mit einem GET-Parameter zu filtern, so dass ich die Posts in zwei Gruppen teilen kann, abhängig davon, mit welchen Begriffen sie markiert sind.

Wie: Bisher habe ich mich entschieden, den pre_get_posts Hook zu verwenden und die Abfrage zu ändern, wenn das Archiv für diesen benutzerdefinierten Post-Typ gerendert wird.

Das Problem: Der Code, den ich verwende, funktioniert nicht. Ich kann das Problem nicht finden, aber es funktioniert definitiv nicht. Vielleicht kann jemand, der mehr Erfahrung mit diesem Haken hat, mir sagen, was ich vermisse:

 function event_type_filter( $query ) { if ( is_post_type_archive( 'event' ) ) { if ( isset($_GET["event_term"]) ) { $tipo_de_curso = $_GET["event_term"]; if ( $tipo_de_curso == "singleclass" ) { $query->set( 'cat', '1,2,3,4' ); } if ( $tipo_de_curso == "course" ) { $query->set( 'cat', '-1,-2,-3,-4' ); } } } return $query; } add_action('pre_get_posts','event_type_filter'); 

Hier im Codex empfehlen sie einen ähnlichen Ansatz, und ich kann die Unterschiede nicht erkennen, aber sicher muss es einige geben. Es gibt einige Fragen auf dieser Seite über diesen Haken, der als Modell dienen sollte, aber ich habe nicht gesehen, wie ich mich an meinen Fall anpasse.

Irgendwelche Ideen? Vielen Dank 🙂

Solutions Collecting From Web of "Wie ändert man die Abfrage mit pre_get_posts hook und is_post_type_archive?"

Sie sollten Methoden der $query Instanz anstelle der is_* Tags verwenden. Und sind die Kategorien, die Sie versuchen, eine benutzerdefinierte Taxonomie zu filtern? cat funktioniert nur für die Standardkategorie Taxonomie:

 function wpse_178500_event_type_filter( $wp_query ) { if ( ! empty( $_GET['event_term'] ) && $wp_query->is_main_query() && $wp_query->get( 'post_type' ) === 'event' ) { $tipo_de_curso = $_GET['event_term']; if ( ! $tax_query = $wp_query->get( 'tax_query' ) ) $tax_query = array(); if ( $tipo_de_curso === 'singleclass' ) { $tax_query[] = array( 'taxonomy' => 'category', // Make sure this is correct! "category" is the default post category. 'field' => 'term_id', 'terms' => array( 1, 2, 3, 4 ), ); } elseif ( $tipo_de_curso === 'course' ) { $tax_query[] = array( 'taxonomy' => 'category', // Make sure this is correct! "category" is the default post category. 'operator' => 'NOT IN', 'field' => 'term_id', 'terms' => array( 1, 2, 3, 4 ), ); } $wp_query->set( 'tax_query', $tax_query ); } } add_action( 'pre_get_posts','wpse_178500_event_type_filter' );