Проверка принадлежности записи к термину таксономии
У меня есть произвольный тип записи articles
. Я также создал таксономию subject
. Каждая статья имеет предмет, так же как обычные записи имеют категории.
Теперь к проблеме. Когда я нахожусь на странице page-articles.php
(page-slug.php
), мне нужно проверить, какой предмет назначен статье. Как это сделать?! Я искал решение в интернете несколько дней, но ничего не нашел.
Я думаю, что каким-то образом нужно проверить таксономию subject на соответствие критерию. Например так:
if (is_term('news', 'subject')){
// выполнить это
}
Но я действительно не могу понять, как это работает! Функция is_term
не делает этого, и я не могу найти никакую другую подходящую функцию.

if( has_term( 'jazz', 'genre' ) ) {
// выполнить действие
}

Я попробовал код ниже, и он работает — это то, что вам нужно?
<?php
// получаем записи вашего пользовательского типа и выводим их все
query_posts('post_type=articles&posts_per_page=-1');
if ( have_posts() ) : while ( have_posts() ) : the_post();
// здесь вы можете вывести заголовок, постоянную ссылку и т.д. внутри цикла
// получаем все элементы вашей пользовательской таксономии
$terms = get_the_terms($post->ID, 'Subject');
// перебираем каждый элемент и выполняем проверку
foreach ( $terms as $term ) {
if($term->name == 'Термин, который вы проверяете') {
// выполняем нужные действия здесь
}
}
endwhile; endif;
?>
Замените 'Термин, который вы проверяете' выше на фактическое название предмета, который вы проверяете, а не на его ярлык (slug).
Примечание: Я не эксперт по производительности баз данных, поэтому не уверен, что это оптимальный способ получения нужной вам информации — я открыт для предложений других.

У меня был интересный опыт борьбы с этой проблемой.
Я использовал http://codex.wordpress.org/Function_Reference/get_the_terms http://codex.wordpress.org/Function_Reference/is_object_in_term
Мне нужно было выводить заголовки категорий и другие метаданные в зависимости от наличия терминов таксономии.
Я получал непредсказуемые результаты при использовании is_object_in_term для проверки МАССИВА определенных терминов, но возможно мой опыт кому-то пригодится. В итоге я добился работоспособности, используя NULL, но мне просто нужно было проверить, существует ли таксономия и ЛЮБЫЕ её термины применяются к просматриваемой записи, чтобы вывести определенные элементы отображения.
Я предполагаю, что если вам нужно проверить только ОДИН термин, стандартные примеры на странице codex должны помочь. Что-то вроде...
if ( is_object_in_term( $post->ID, 'news', 'subject' ) ) :
echo 'ДА';
else :
echo 'НЕТ';
endif;
Мой соответствующий код ниже:
$heading_nicename = array('Категория','Районы','Почтовые индексы','Участники','Ближайший общественный транспорт');
$tax_slug = array('category','neighborhoods','zip_codes','member_agencies','nearest_public_transportation');
$heading_key = 0;
$termindex = 0;`
foreach ( $tax_slug as $taxonomy ) {
//использовалось для вывода терминов в виде ссылок
$object_terms = wp_get_object_terms($post->ID, $taxonomy, array('fields' => 'all'));
//использовалось для проверки, применяются ли термины таксономии к записи
$o_terms = get_the_terms( $post->ID, $taxonomy );
if ( $o_terms && ! is_wp_error( $o_terms ) ) {
$check_these_terms = array();
}
foreach ( $o_terms as $term ) {
$check_these_terms[] = $term->slug;
//echo $term->slug.'<br/>';
}
$o_list = join( ", ", $check_these_terms );
//echo 'taxonomy: '.$taxonomy.'<br/>';
//echo 'terms: '.$o_list.'<br/>';
//непредсказуемые результаты
//if ( is_object_in_term( $post->ID, $taxonomy, array($o_list ) ){
//echo '<h4>'.$heading_nicename[$heading_key].'</h4>';
//}
//В итоге проверка на ЛЮБОЙ термин в таксономии
if ( is_object_in_term( $post->ID, $taxonomy, null ) ){
echo '<h4>'.$heading_nicename[$heading_key].'</h4>';
}
$heading_key++;
echo '<p>';
$endindex = count($object_terms);
$termloop = 0;
foreach ($object_terms as $term) {
echo '<a href="' . esc_attr(get_term_link($term, $taxonomy)) . '" title="' . sprintf( __( "Просмотреть все записи в %s" ), $term->name ) . '" ' . '>' . $term->name.'</a>';
//убираем лишние запятые
if ($termloop !== ($endindex - 1)){
echo ', ';
$termloop++;
}
$termindex++;
}
echo '</p>';
}`
