tax_query funktioniert nicht bei der Hauptabfrage

Ich verwende den folgenden Code, um eine Steueranfrage zu stellen und es scheint nicht mehr zu funktionieren.

Irgendwann hat es funktioniert und für das Leben von mir wird es nicht mehr.

site_terms = array( 1, 2, 3 ); } function filter_query( $query ) { // not the main query? if ( !$query->is_main_query() ) { return $query; } // have terms to filter by? if ( !empty( $this->site_terms ) ) { // construct tax_query $tax_query = array( 'taxonomy' => 'site_category', 'field' => 'id', 'terms' => $this->site_terms, 'operator' => 'IN' ); // this needs to be an array of arrays $taxquery = array( $tax_query ); // set this.. $query->set( 'tax_query', $taxquery ); } // return new query object return $query; } } // not the admin? init class if ( !is_admin() ) { $pf_override = new PF_override(); } ?> 

Taxonomie wird wie folgt hinzugefügt:

 function PF_register_post_type() { $labels = array( 'name' => _x( 'Site Category', 'taxonomy general name' ), 'singular_name' => _x( 'Site Category', 'taxonomy singular name' ), 'search_items' => __( 'Search Site Categories' ), 'all_items' => __( 'All Site Categories' ), 'parent_item' => __( 'Parent Site Category' ), 'parent_item_colon' => __( 'Parent Site Category:' ), 'edit_item' => __( 'Edit Site Category' ), 'update_item' => __( 'Update Site Category' ), 'add_new_item' => __( 'Add New Site Category' ), 'new_item_name' => __( 'New Site Category Name' ), 'menu_name' => __( 'Site Category' ), ); $args = array( 'hierarchical' => true, 'labels' => $labels, 'show_ui' => true, 'show_admin_column' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'sitecat' ), ); register_taxonomy( 'site_category', array( 'post', 'page', 'attachment', 'revision', 'nav_menu_item' ), $args ); } add_action( 'init', 'PF_register_post_types', 1 ); 

In meiner footer.php füge ich diesen Code hinzu:

 $GLOBALS['wp_query']->request 

Ich erhalte dies, wenn ich zu mydomain.com/testing gehe:

 SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_name = 'testing' AND wp_posts.post_type = 'post' ORDER BY wp_posts.post_date DESC 

Die Variable $ pf_override zeigt $ pf_override-> site_terms als Array von

 array( [0] => 1, [1] => 2, [2] => 3 ) 

Solutions Collecting From Web of "tax_query funktioniert nicht bei der Hauptabfrage"

Ich möchte eine einfache Lösung geben.

 add_action('pre_get_posts', 'filter_query'); function filter_query( $query ) { // **PLEASE NOTE** // $this->site_terms refers specifically to logic in the question if ( $query->is_main_query() && $query->is_singular && ! empty( $this->site_terms ) ) { $site = get_queried_object(); $terms = wp_get_object_terms($site->ID, 'site_category', array('fields' => 'ids') ); if ( empty($terms) || empty( array_intersect($terms, $this->site_terms) ) ) { $query->set( 'page_id', -1 ); // 404 } } } 

Als zusätzlichen Vorteil, ändern $query->set( 'page_id', -1 ); Mit der ID einer speziell erstellten Seite ist es möglich, Besucher auf eine gewünschte Seite umzuleiten, anstatt einen 404-Fehler zu erzwingen.

Ich hoffe es hilft.

Nun, es scheint nach dem Einstieg in den Code, wird Tax_Query auf einzelnen Post / Seite Seiten blockiert, weshalb ich auf dieses Problem renne.

Wenn Sie die Möglichkeit sehen, tax_query unter allen Umständen als nützlich zu nutzen, sagen Sie bitte Ihre Meinung zu trac.

Siehe Ticket hier: http://core.trac.wordpress.org/ticket/24819

Es gelang mir, dies zu umgehen, indem ich den corecode für singuläre Posts duplizierte und an die Join- und Where-Klauseln anfügte. Der neue Code lautet wie folgt:

 < ?php global $pf_override; class PF_override { public $site_terms = array(); public $sql_join = ''; public $sql_where = ''; function __construct() { // add filters add_filter( 'init', array( &$this, 'populates_site_terms' ) ); add_filter( 'pre_get_posts', array( &$this, 'filter_query' ) ); add_filter( 'posts_join', array( &$this, 'filter_join' ) ); add_filter( 'posts_where', array( &$this, 'filter_where' ) ); } function populates_site_terms() { // my actual function does some processing and // checks caches and combines IDs from multiple // different sources here and then sets site_terms $this->site_terms = array( 1, 2, 3 ); } function filter_query( $query ) { // not the main query? if ( !$query->is_main_query() ) { return $query; } // have terms to filter by? if ( !empty( $this->site_terms ) ) { // construct tax_query $tax_query = array( 'taxonomy' => 'site_category', 'field' => 'id', 'terms' => $this->site_terms, 'operator' => 'IN' ); // this needs to be an array of arrays $taxquery = array( $tax_query ); // set this.. $query->set( 'tax_query', $taxquery ); if ( $query->is_singular ) { global $wpdb; $q = &$query->query_vars; $q['suppress_filters'] = false; $query->parse_tax_query( $q ); $clauses = $query->tax_query->get_sql( $wpdb->posts, 'ID' ); $this->sql_join .= $clauses['join']; $this->sql_where .= $clauses['where']; } } return $query; } function filter_join( $join ) { if ( !empty( $this->sql_join ) ) { $join .= $this->sql_join; } return $join; } function filter_where( $where ) { if ( !empty( $this->sql_where ) ) { $where .= $this->sql_where; } return $where; } } // not the admin? init class if ( !is_admin() ) { $pf_override = new PF_override(); } ?>