Запрос записей по ID произвольной таксономии

7 окт. 2011 г., 16:06:24
Просмотры: 47.7K
Голосов: 8

У меня есть произвольный тип записи portfolio и произвольная таксономия build-type (действует как категории)

Я пытаюсь запросить записи portfolio по ID build-type, например, все записи Портфолио в разделе "Отели" (id=4 для этой таксономии)

// получаем ID из произвольного поля для отображения записей на определенной странице
$buildType = get_post_meta($post->ID, 'build_type_id', true);
// выполняем запрос
query_posts(array( 
    'post_type' => 'portfolio',
    'showposts' => -1,
    'tax_query' => array(
        'taxonomy' => 'build-type',
        'terms' => $buildType,
        'field' => 'term_id'
    ),
    'orderby' => 'title',
    'order' => 'ASC'
));

В настоящее время он выводит все записи portfolio, а не только те, которые имеют указанный ID build-type

Для параметра 'field' => 'term_id' следует использовать term_id, tag_ID, id или что-то другое?

Кто-нибудь знает, как это исправить?

Заранее спасибо!

0
Все ответы на вопрос 4
2
14

Причина, по которой это не работает, заключается в том, что 'tax_query' должен быть массивом массивов (знаю, звучит запутанно).

...

'tax_query' => array(
    array(
        'taxonomy' => 'build-type',

...

Это сделано таким образом, чтобы можно было объединить несколько различных правил вместе.

7 окт. 2011 г. 19:00:40
Комментарии

Отличная работа, Drew. Это решило проблему. Выложил финальный скрипт на Github https://gist.github.com/1275191

mattberridge mattberridge
10 окт. 2011 г. 15:36:04

Спасибо! Потратил час из бюджета клиента на решение этой незначительной проблемы :)

Tom Tom
9 янв. 2017 г. 17:34:10
3

Дрю был прав, tax-query должен быть массивом массивов.

Окончательное решение:

// получаем ID из произвольного поля для отображения записей на конкретной странице
$buildType = get_post_meta($post->ID, 'build_type_id', true);
// выполняем запрос
query_posts(array( 
    'post_type' => 'portfolio',
    'showposts' => -1,
    'tax_query' => array(
        array(
            'taxonomy' => 'build-type',
            'terms' => $buildType,
            'field' => 'term_id',
        )
    ),
    'orderby' => 'title',
    'order' => 'ASC' )
);

На GitHub здесь:

https://gist.github.com/1275191

Спасибо!

19 окт. 2011 г. 11:27:49
Комментарии

Отклонение моего ответа и принятие своего собственного действительно ранит, чувак... прямо в сердце. Если кто-то будет искать меня, я буду в лаунж-зоне.

Drew Gourley Drew Gourley
19 окт. 2011 г. 16:07:24

Ха, прости, дружище. Я новичок во всём этом и не знал, что можно принять только один ответ. Я исправлю отметку, чтобы ты мог вернуться из лаунж-зоны.

mattberridge mattberridge
20 окт. 2011 г. 13:28:04

Хаха, да всё в порядке, чувак, я просто пошутил — если хочешь принять свой ответ, это вполне разрешено, но не забудь проголосовать за мой ответ, чтобы я хотя бы получил немного очков.

Drew Gourley Drew Gourley
20 окт. 2011 г. 16:34:36
0

Вам необходимо создать массив внутри tax_query, где также можно выбирать операторы. Например, вывод print_r для tax_query должен выглядеть следующим образом.

Array
(
    [relation] => AND
    [0] => Array
        (
            [taxonomy] => build-type
            [terms] => Array
                (
                    [0] => term1
                    [1] => term2blabla
                )

            [field] => slug
            [operator] => IN
        )

    [1] => Array
        (
            [taxonomy] => another-taxonomie
            [terms] => Array
                (
                    [0] => term1
                    [1] => term2
                )

            [field] => slug
            [operator] => IN
        )

)

Конечно, вы можете изменить field на id, но я всегда использую slug для простоты. Как видите, вы можете запрашивать несколько таксономий таким образом.

7 окт. 2011 г. 19:28:53
0
-1

Вам не нужно использовать tax_query, удалите его и добавьте следующее:

term=>build-type,'build-type=>hotels' например.

8 окт. 2011 г. 01:40:36