У меня есть два пользовательских типа постов 'страна' и 'город' и общий флаг таксономии.
Если я использую:
<?php $flags = get_terms('flag', 'orderby=name&hide_empty=0');
Я получаю список всех терминов в таксономии, но я хочу ограничить список типом поста "страна".
Как мне это сделать?
Используя новое решение
<?php
$flags = wpse57444_get_terms('flags',array('parent' => 0,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($flags as $flag) {
$childTerms = wpse57444_get_terms('flags',array('parent' => $flag->term_id,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($childTerms as $childTerm) {
echo $childTerm->name.'<br />';
}
}
?>
Я не могу повторить $ childTerm-> name. Почему?
custom-post-types
taxonomy
terms
user1443216
источник
источник
Ответы:
Боюсь, это не возможно изначально (пока?). Смотрите этот трек: http://core.trac.wordpress.org/ticket/18106
Аналогично на странице администратора таксономии количество сообщений отражает все типы сообщений. (
Я почти уверен, что для этого тоже есть трейк-билет) http://core.trac.wordpress.org/ticket/14084Смотрите также этот пост .
Новое решение
Написав приведенный ниже, я выпустил гораздо лучший способ (хотя и в том смысле, что вы можете сделать больше) - использовать фильтры, предоставляемые в
get_terms()
вызове. Вы можете создать функцию-оболочку, которая используетget_terms
и (условно) добавляет фильтр для управления запросом SQL (для ограничения по типу записи).Функция принимает те же аргументы, что и
get_terms($taxonomies, $args)
.$args
принимает дополнительный аргументpost_types
которого принимает массив | строку типов записей.Но я не могу гарантировать, что все работает "как положено" (я думаю, что набиваю счет). Похоже, что он работает, используя просто по умолчанию
$args
дляget_terms
.использование
Оригинальное решение
Вдохновленный вышеупомянутым билетом trac, (проверено, и это работает для меня)
использование
или
источник
$args = array('parent'=>0,'orderby'=>'name','hide_empty'=>0);
. Я отредактирую это, чтобы разрешить строки запроса ...$terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));
:?wpse57444_get_terms()
$args
- второй аргумент. Там вы просто положилиwpse57444_get_terms( 'flag', array( 'country', 'city' ) );
Ответ Стивена-Харриса выше только работал для меня частично. Если я попытался использовать его дважды на странице, это не сработало. Кроме того, меня беспокоит мысль о том, чтобы скрывать подобные запросы mysql - я думаю, что лучше использовать основные методы для достижения решения, чтобы избежать конфликтов с будущими обновлениями WP. Вот мое решение, основанное на некотором комментарии № 7 о билете Trac, на который он ссылается
Использование:
Это работает только для одного типа записи и одной таксономии, потому что это то, что мне было нужно, но было бы не сложно изменить это так, чтобы оно принимало несколько значений.
На этой ветке Trac было упомянуто, что это может плохо масштабироваться, но я работаю в довольно небольшом масштабе и у меня не было проблем со скоростью.
источник
Два пользовательских типа постов «страна» и «город» и общая таксономия «флаг». Вы хотите ограничить список типом поста "страна".
Вот более простое решение:
источник
[править] Это комментарий к отличному ответу Стивена Харриса.
Он не возвращает никаких терминов, если используется с несколькими типами записей, как это
$flags = wpse57444_get_terms('flags', array('post_types' => array('country','city')));
. Это связано с тем, что $ wpdb-> prepare очищает строку $ post_types_str до техp.post_type IN('country,city')
пор, пока она должна бытьp.post_type IN('country','city')
. Смотрите этот билет: 11102 . Используйте решение из этой темы, чтобы обойти это: /programming//a/10634225источник
Я также пытался использовать ответ @Stephen Harris, но запрос, который мне был нужен, было довольно сложно написать в виде отдельного запроса с использованием частей фильтра.
Кроме того, мне также нужно было использовать эту функцию несколько раз на одной странице, и я решил проблему с объявлением
wpse_filter_terms_by_cpt
функции вне функции-оболочки.В любом случае, ответ @Mark Pruce, по моему мнению, подходит лучше по тем же причинам, которые он сказал, даже если вам нужно сделать еще один запрос (и связанный цикл), чтобы подготовить аргументы для
wp_get_object_terms
функции.источник