При использовании налогового запроса результаты исчезают (0 = 1 получено)


Я пытаюсь выполнить динамический запрос, который использует динамически передаваемую таксономию и тип post_type и отображает результаты соответственно -

Пользователь делает выбор из 3 раскрывающихся списков в форме, каждый из которых имеет значение. Это передается строкой запроса URL. Запрос на странице выбирает параметры из URL-адреса, используя $_GET.

Когда я просто вытаскиваю post_type и несколько других частей, этот код работает нормально.

global $query
$dat_argument = array ( 'post_type' => $type,
                        'orderby' => 'rand',
                        'showposts' => $posts,
                        );

$query = new WP_Query($dat_argument);   

Однако, когда я включаю tax_query как ниже...

global $query;

$tax_queries[] = array(
    array (
    'taxonomy' => 'difficulty_mode',
    'terms' => $mode,
    'field' => 'slug'
    )
);

$dat_argument = array ( 'post_type' => $type,
                        'orderby' => 'rand',
                        'showposts' => $posts,
                        'tax_query' => $tax_queries
                        );

$query = new WP_Query($dat_argument);   

Я получаю 0 сообщений и вывод 0= 1, когда я запускаю print_r($query).

Ниже приведен var_dump запроса:

object(WP_Query)#203 (44) { 
["query_vars"]=> array(61) { 
["post_type"]=> string(11) "bw-exercise" 
["orderby"]=> string(4) "rand"
["showposts"]=> int(5)
["tax_query"]=> array(1) {
[0]=> array(3) {
["taxonomy"]=> string(15) "difficulty_mode"
["terms"]=> array(1) {
[0]=> string(1) "1" }
["field"]=> string(4) "slug" } }
["error"]=> string(0) ""
["m"]=> int(0)
["p"]=> int(0)
["post_parent"]=> string(0) ""
["subpost"]=> string(0) ""
["subpost_id"]=> string(0) ""
["attachment"]=> string(0) ""
["attachment_id"]=> int(0)
["name"]=> string(0) ""
["static"]=> string(0) ""
["pagename"]=> string(0) ""
["page_id"]=> int(0)
["second"]=> string(0) ""
["minute"]=> string(0) ""
["hour"]=> string(0) ""
["day"]=> int(0)
["monthnum"]=> int(0)
["year"]=> int(0)
["w"]=> int(0)
["category_name"]=> string(0) ""
["tag"]=> string(0) ""
["cat"]=> string(0) ""
["tag_id"]=> string(0) ""
["author_name"]=> string(0) ""
["feed"]=> string(0) ""
["tb"]=> string(0) ""
["paged"]=> int(0)
["comments_popup"]=> string(0) ""
["meta_key"]=> string(0) ""
["meta_value"]=> string(0) ""
["preview"]=> string(0) ""
["s"]=> string(0) ""
["sentence"]=> string(0) ""
["fields"]=> string(0) ""
["menu_order"]=> string(0) ""
["category__in"]=> array(0) { }
["category__not_in"]=> array(0) { }
["category__and"]=> array(0) { }
["post__in"]=> array(0) { }
["post__not_in"]=> array(0) { }
["tag__in"]=> array(0) { }
["tag__not_in"]=> array(0) { }
["tag__and"]=> array(0) { }
["tag_slug__in"]=> array(0) { }
["tag_slug__and"]=> array(0) { }
["ignore_sticky_posts"]=> bool(false)
["suppress_filters"]=> bool(false)
["cache_results"]=> bool(true)
["update_post_term_cache"]=> bool(true)
["update_post_meta_cache"]=> bool(true)
["posts_per_page"]=> int(5)
["nopaging"]=> bool(false)
["comments_per_page"]=> string(2) "50"
["no_found_rows"]=> bool(false)
["taxonomy"]=> string(15) "difficulty_mode"
["term"]=> string(1) "1"
["order"]=> string(4) "DESC" }
["tax_query"]=> object(WP_Tax_Query)#200 (2) {
["queries"]=> array(1) {
[0]=> array(5) {
["taxonomy"]=> string(15) "difficulty_mode"
["terms"]=> array(1) {
[0]=> string(1) "1" }
["include_children"]=> bool(true)
["field"]=> string(4) "slug"
["operator"]=> string(2) "IN" } }
["relation"]=> string(3) "AND" }
["meta_query"]=> object(WP_Meta_Query)#201 (2) {
["queries"]=> array(0) { }
["relation"]=> NULL }
["post_count"]=> int(0)
["current_post"]=> int(-1)
["in_the_loop"]=> bool(false)
["comment_count"]=> int(0)
["current_comment"]=> int(-1)
["found_posts"]=> int(0)
["max_num_pages"]=> int(0)
["max_num_comment_pages"]=> int(0)
["is_single"]=> bool(false)
["is_preview"]=> bool(false)
["is_page"]=> bool(false)
["is_archive"]=> bool(true)
["is_date"]=> bool(false)
["is_year"]=> bool(false)
["is_month"]=> bool(false)
["is_day"]=> bool(false)
["is_time"]=> bool(false)
["is_author"]=> bool(false)
["is_category"]=> bool(false)
["is_tag"]=> bool(false)
["is_tax"]=> bool(true)
["is_search"]=> bool(false)
["is_feed"]=> bool(false)
["is_comment_feed"]=> bool(false)
["is_trackback"]=> bool(false)
["is_home"]=> bool(false)
["is_404"]=> bool(false)
["is_comments_popup"]=> bool(false)
["is_paged"]=> bool(false)
["is_admin"]=> bool(false)
["is_attachment"]=> bool(false)
["is_singular"]=> bool(false)
["is_robots"]=> bool(false)
["is_posts_page"]=> bool(false)
["is_post_type_archive"]=> bool(false)
["query_vars_hash"]=> string(32) "d289f5774bbde27aa3902982141a66ab"
["query_vars_changed"]=> bool(false)
["thumbnails_cached"]=> bool(false)
["query"]=> array(4) {
["post_type"]=> string(11) "bw-exercise"
["orderby"]=> string(4) "rand"
["showposts"]=> string(1) "5"
["tax_query"]=> array(1) {
[0]=> array(3) {
["taxonomy"]=> string(15) "difficulty_mode"
["terms"]=> array(1) {
[0]=> string(1) "1" }
["field"]=> string(4) "slug" } } }
["request"]=> string(278) "SELECT SQL_CALC_FOUND_ROWS wrd_posts.ID FROM wrd_posts WHERE 1=1 AND 0 = 1 AND wrd_posts.post_type = 'bw-exercise' AND (wrd_posts.post_status = 'publish' OR wrd_posts.post_author = 1 AND wrd_posts.post_status = 'private') GROUP BY wrd_posts.ID ORDER BY RAND() DESC LIMIT 0, 5"
["posts"]=> array(0) { } }

Совершенно сбит с толку. Я прочитал все темы, связанные с tax_query, и попробовал все, что мог, но безрезультатно.

Любые мысли о том, что является причиной этого?

Контрольные точки:

  • Все это проводится в верхней части обычая functions.php файл для диссертации. Это глобальный, так что на него можно ссылаться еще одна функция, которая извлекает идентификатор записи записей, выводимых из запроса.

  • Использование "Типы - Комплексное решение для пользовательских полей и типов" для создания/управления пользовательскими типами записей, таксономиями и полями.

  • Тема диссертации 1.8.4

Author: rbcpt, 2013-03-30

3 answers

tax_query принимает массив массивов. У вас есть массив массивов массивов. var_dump($tax_queries); и получите это:

array(1) {
  [0]=>
  array(1) {
    [0]=>
    array(3) {
      ["taxonomy"]=>
      string(15) "difficulty_mode"
      ["terms"]=>
      NULL
      ["field"]=>
      string(4) "slug"
    }
  }
}

Попробуйте сделать это без квадратных скобок. То есть поверните это:

$tax_queries[] = array(
    array (
    'taxonomy' => 'difficulty_mode',
    'terms' => $mode,
    'field' => 'slug'
    )
);

В это

$tax_queries = array(
    array (
    'taxonomy' => 'difficulty_mode',
    'terms' => $mode,
    'field' => 'slug'
    )
);

Изменить:

Я провел некоторое дополнительное тестирование. Когда я редактирую этот запрос, чтобы на моем тестовом сервере были известны хорошие значения, он работает. Следующий запрос работает точно так, как ожидалось:

$tax_queries = array(
    array (
    'taxonomy' => 'category',
    'terms' => array('aciform'),
    'field' => 'slug'
    )
);

$dat_argument = array ( 'post_type' => 'post',
                        'orderby' => 'rand',
                        'showposts' => 10,
                        'tax_query' => $tax_queries
                        );

$query = new WP_Query($dat_argument);  
var_dump($query);

Если я отредактирую его, чтобы он имел заведомо плохое значение - для пример - 'terms' => array('nada'), или 'taxonomy' => 'bad_category', - Я получаю сегмент запроса 1=1 AND 1 = 0, из-за которого запрос ничего не возвращает. Проблема в том, не является ли запрос. Проблема в том, что в запрос передаются неверные значения.

Я не знаю, какое из ваших значений неверно, но либо ваше название таксономии неверно, либо ваши слизняки неверны. Другого выхода нет. Использование допустимых слизней без связанных записей просто возвращает пустой результирующий набор, но не содержит компонента 0 = 1.

 5
Author: s_ha_dum, 2013-03-31 22:12:33

Используйте массив одного измерения.

Измените это

$tax_queries[] = array(
    array (
    'taxonomy' => 'difficulty_mode',
    'terms' => $mode,
    'field' => 'slug'
    )
);

До

'tax_query' => array(
    'taxonomy' => 'difficulty_mode',
    'terms' => $mode,
    'field' => 'slug'
);
 1
Author: buzibuzi, 2017-02-07 16:01:51

Исправление, которое я сделал, состояло в том, чтобы установить фильтр для решения проблемы 0=1: В моем случае я пытался повлиять только на тип публикации продукта, поэтому я не хотел фильтровать и влиять на все инструкции SQL.

add_filter( 'posts_where', 'acff_sqlfix', 10, 1 );

function acff_sqlfix( $sql ) {
        if ((get_query_var( 'post_type' ) == 'product') && (strpos($sql, ' 0 = 1') > 0)) {
            $sql = str_replace(' 0 = 1', ' 1 = 1', $sql);
        }
        return $sql;
}
 0
Author: Shawn DeWolfe, 2020-01-17 18:18:32