WordPress как на ладони
wordpress jino

is_object_in_term() WP 2.7.0

Определяет связан ли указанный объект с любым из указанных элементов таксономии (термином). Можно указать конкретный термин(ы) для проверки связи.

Указанные термины сравниваются с ID, названием и слагом терминов объекта. Если передать термины как числа, то сравнение будет только с ID терминов объекта. Если не указать термин, то функция проверит есть ли у объекта хоть один термин из указанной таксономии.

Используется в: has_term().
Работает на основе: wp_get_object_terms(), get_object_term_cache()
✈ 1 раз = 0.000809с = медленно | 50000 раз = 1.16с = быстро PHP 7.0.8, WP 4.6.1

Хуков нет.

Возвращает

true, если объект относится к термин или false. Объект WP_Error, если произошла ошибка.

Использование

if( is_object_in_term( $object_id, $taxonomy, $terms ) ){
	...
}
$object_id(число) (обязательный)
ID поста, связь которого с термином нужно проверить.
$taxonomy(строка) (обязательный)
Название таксономии, к которой принадлежит термин из параметра $terms.
$terms(строка/массив/число)
ID, название или слаг термина. Можно указать несколько терминов в массиве.
По умолчанию: null

Примеры

#1 Проверка наличия терминов у объекта

Проверим, находится ли текущий пост ($post->ID) в термине "Языки" (yaziki или ID=5), таксономии 'my_taxonomy':

$is_in = is_object_in_term( $post->ID, 'my_taxonomy', 'yaziki' );
if ( $is_in )
	echo 'Пост находится в термине "Языки"';

// также можно указать термин так
$is_in = is_object_in_term( $post->ID, 'my_taxonomy', 'Языки' );
// или 
$is_in = is_object_in_term( $post->ID, 'my_taxonomy', 5 );
#2 Проверка нескольких терминов
$is_in = is_object_in_term( $post->ID, 'my_taxonomy', array('Языки', 25) );
if( $is_in )
	echo 'Пост связан с одним из терминов: Языки', 25';

Код is object in term: wp-includes/taxonomy.php VER 4.9.1

<?php
function is_object_in_term( $object_id, $taxonomy, $terms = null ) {
	if ( !$object_id = (int) $object_id )
		return new WP_Error( 'invalid_object', __( 'Invalid object ID.' ) );

	$object_terms = get_object_term_cache( $object_id, $taxonomy );
	if ( false === $object_terms ) {
		$object_terms = wp_get_object_terms( $object_id, $taxonomy, array( 'update_term_meta_cache' => false ) );
		if ( is_wp_error( $object_terms ) ) {
			return $object_terms;
		}

		wp_cache_set( $object_id, wp_list_pluck( $object_terms, 'term_id' ), "{$taxonomy}_relationships" );
	}

	if ( is_wp_error( $object_terms ) )
		return $object_terms;
	if ( empty( $object_terms ) )
		return false;
	if ( empty( $terms ) )
		return ( !empty( $object_terms ) );

	$terms = (array) $terms;

	if ( $ints = array_filter( $terms, 'is_int' ) )
		$strs = array_diff( $terms, $ints );
	else
		$strs =& $terms;

	foreach ( $object_terms as $object_term ) {
		// If term is an int, check against term_ids only.
		if ( $ints && in_array( $object_term->term_id, $ints ) ) {
			return true;
		}

		if ( $strs ) {
			// Only check numeric strings against term_id, to avoid false matches due to type juggling.
			$numeric_strs = array_map( 'intval', array_filter( $strs, 'is_numeric' ) );
			if ( in_array( $object_term->term_id, $numeric_strs, true ) ) {
				return true;
			}

			if ( in_array( $object_term->name, $strs ) ) return true;
			if ( in_array( $object_term->slug, $strs ) ) return true;
		}
	}

	return false;
}

Cвязанные функции

Из метки: term (термины таксономий)

Еще из раздела: Для записей

is_object_in_term 3 комментария
  • Kirill Malahov2 cайт: malahov-web.ru @

    Здравствуйте.
    Столкнулся с головоломкой.

    Можно ли узнать: принадлежит ли пост какому-либо термину пользовательской таксономии, если таксономия неизвестна (таксономия будет создана позднее) ?

    • Kama4696

      Можно. Получаешь таксы записи get_object_taxonomies() и по очереди для каждой из них проверяешь есть ли термин get_the_terms()...

      Похожий код - можно найти в функции get_the_taxonomies()

      • Kirill Malahov2 cайт: malahov-web.ru @

        Спасибо за наводку, Тимур.

        Для своей задачи сначала get_the_taxonomies() и использовал .

        Получилась вот такая ф-я выдающая массив с парами термин-таксономия, может кому-то пригодится.

        // Проверяет принадлежность поста к терминам и таксономиям
        function post_belong($post) {
        // На вход получает объект (WP object)
        // Возвращает массив (array)
        
        	$post_belong = array();
        	$post_taxonomies = get_object_taxonomies($post); 
        
        	for ( $i=0; $i < count($post_taxonomies); $i++ ){
        		//echo ''.$i.' Элемент массива:'.$post_taxonomies[$i];
        		$terms = get_the_terms( $post->ID, $post_taxonomies[$i] );
        		if ( $terms != 0 ){
        			//echo 'Пост принадлежит термину'.$terms[0]->name;
        			$post_belong[]['term_id'] = $terms[0]->term_id;
        			$post_belong[ count($post_belong) - 1 ]['taxonomy'] = $post_taxonomies[$i];
        		}       
        	}
        	return $post_belong;
        }
        
        $post_belong = post_belong($post);
        
        echo '<br>Принадлежность поста: '; var_dump( $post_belong );
        

        По идее должно работать быстрее чем get_the_taxonomies(), которая использует медленную wp_get_object_terms()

        1

Здравствуйте, !

Ваш комментарий