Intereting Posts
почему я не могу получить идентификатор комментария? Создать страницу только для темы Зарегистрировать пользователя, заполнив контактную форму current_user_can ('edit_post', $ post_id) не работает для вкладчика, но для администратора Добавить местоположение местоположения с радиусом мили, позволяющим искать Удалить Custom Post Type Slug и добавить пользовательскую таксономию в структуру Permalink? Функция add_option_page ведет себя странно Custom Post Type Plugin не загружает шаблон категории и загружает 404 вместо Как добавить / изменить значение свойства $ wpdb / var? Расширенный налоговый запрос WP_Query $ gallerypage-> the_post (), дающая неопределенное смещение: 0 Есть ли плагин, который предоставляет редактор стиля stackoverflow для wordpress? Как правильно загружать файлы с пользователей ninjaforms не будет заполнять пользовательскую тему Как отделить уровни ссылок в пользовательском ходу?

tax_query не работает над основным запросом

Я использую следующий код, чтобы сделать tax_query, и он больше не работает.

В какой-то момент это работало, и для меня это уже не было.

<?php global $pf_override; class PF_override { public $site_terms = array(); function __construct() { // add filters add_filter( 'init', array( &$this, 'populates_site_terms' ) ); add_filter( 'pre_get_posts', array( &$this, 'filter_query' ) ); } 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 ); } // return new query object return $query; } } // not the admin? init class if ( !is_admin() ) { $pf_override = new PF_override(); } ?> 

Таксономия добавляется так:

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

В моем footer.php я добавляю этот код:

 $GLOBALS['wp_query']->request 

Я получаю это в результате при переходе на mydomain.com/testing:

 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 

Переменная $ pf_override показывает $ pf_override-> site_terms, которая должна быть установлена ​​как массив

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

Solutions Collecting From Web of "tax_query не работает над основным запросом"

Я хочу дать простое решение.

 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 } } } 

В качестве дополнительной выгоды, изменяя $query->set( 'page_id', -1 ); с идентификатором страницы, специально созданной, возможно перенаправить посетителей на нужную вам страницу, вместо того чтобы принудительно вызвать ошибку 404.

Надеюсь, поможет.

Ну, похоже, после копания в коде, tax_query блокируется на отдельных страницах страницы / страницы, поэтому я столкнулся с этой проблемой.

Если вы видите возможность запуска tax_query при любых обстоятельствах, как полезный, прокомментируйте ваше мнение о trac.

См. Билет здесь: http://core.trac.wordpress.org/ticket/24819

Мне удалось обойти это, дублируя основной код для отдельных сообщений и добавляя к предложениям join и where. Новый код выглядит следующим образом:

 <?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(); } ?>