Проверка принадлежности записи к термину таксономии

30 мар. 2011 г., 07:26:47
Просмотры: 30.1K
Голосов: 6

У меня есть произвольный тип записи articles. Я также создал таксономию subject. Каждая статья имеет предмет, так же как обычные записи имеют категории.

Теперь к проблеме. Когда я нахожусь на странице page-articles.php (page-slug.php), мне нужно проверить, какой предмет назначен статье. Как это сделать?! Я искал решение в интернете несколько дней, но ничего не нашел.

Я думаю, что каким-то образом нужно проверить таксономию subject на соответствие критерию. Например так:

if (is_term('news', 'subject')){
    // выполнить это
}

Но я действительно не могу понять, как это работает! Функция is_term не делает этого, и я не могу найти никакую другую подходящую функцию.

2
Комментарии

Использовать has_term ?

t31os t31os
30 мар. 2011 г. 13:08:28

Просто чтобы уточнить, вы спрашиваете, как проверить, связан ли конкретный объект с данной статьей, или способ перечисления объектов для статьи? Я видел ответы для обоих вариантов в ответах, и неясно, какие из них лучше подходят для вашей ситуации, не зная этого.

Justin Bell Justin Bell
30 сент. 2014 г. 01:37:45
Все ответы на вопрос 5
1
10
if( has_term( 'jazz', 'genre' ) ) {
    // выполнить действие
}

http://codex.wordpress.org/Function_Reference/has_term

13 дек. 2012 г. 01:45:52
Комментарии

@user4310, Первый параметр — это термин, который вы ищете, а второй параметр — таксономия, к которой относится этот термин.

s_ha_dum s_ha_dum
13 дек. 2012 г. 02:25:56
0

Я попробовал код ниже, и он работает — это то, что вам нужно?

<?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).

Примечание: Я не эксперт по производительности баз данных, поэтому не уверен, что это оптимальный способ получения нужной вам информации — я открыт для предложений других.

30 мар. 2011 г. 08:02:07
1

У меня был интересный опыт борьбы с этой проблемой.

Я использовал 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>';

  }`
2 июн. 2013 г. 05:54:49
Комментарии

первая часть кода сработала в моем случае.

breezy breezy
19 апр. 2017 г. 23:26:37
0

Вы пробовали использовать wp_get_object_terms?

Что-то вроде:

$article_subjects = wp_get_object_terms($post->ID, 'subject');
30 мар. 2011 г. 07:57:55
0

Если у каждой статьи есть тема, вам не нужно проверять, есть ли у неё тема, верно? Тогда вы можете использовать что-то вроде этого:

<?php echo get_the_term_list( $post->ID, 'subject', __('Тема: ', 'theme-name'), '  ', '' ); ?>
30 мар. 2011 г. 14:02:52