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

wp_get_object_terms() WP 2.3.0

Получает термины (элементы таксономии) связанные с переданным объектом(ами) (записями) в указанной таксономии.

Функция является ядром функции get_the_terms(). В большинстве случаев лучше использовать get_the_terms() вместо этой функции, так как там результат кэшируется.

✈ 1 раз = 0.003926с = очень медленно | 50000 раз = 8.64с = быстро PHP 7.1.2, WP 4.8
Хуки из функции:
Возвращает

Массив объектов содержащих информацию о терминах. При ошибке вернет объект WP_Error.

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

wp_get_object_terms( $object_ids, $taxonomies, $args );
$object_ids(строка/массив) (обязательный)
ID объекта(ов), термины которых нужно получить. Более одного ID нужно указывать в массиве: array(23, 56, 89).
По умолчанию: нет
$taxonomies(строка/массив) (обязательный)
Название таксономии термины которой нужно получить. Можно указать несколько названий. Несколько названий нужно передавать через массив: array('category', 'name2').
По умолчанию: нет
$args(строка/массив)

Аргументы, в соответствии с которыми будет получен результат. Можно указывать в виде строки запроса.

С версии WP 4.7, можно указывать все параметры функции get_terms()

По умолчанию: предустановки

  • orderby (строка)
    По какому критерию сортировать результат. Может быть:

    • count - по количеству записей;
    • name - по имени. По умолчанию;
    • slug - по ярлыку;
    • none - выводить без сортировки.

    По умолчанию: 'name'

  • order (строка)
    Направление сортировки. ASC — по порядку, DESC — в обратном порядке.
    По умолчанию: 'ASC'

  • fields (строка)
    Какие поля включать в результирующий массив. Может быть:

    • all - в результате мы получи массив объектов со всей информацией о каждом термине;
    • all_with_object_id - тоже что и all, плюс еще и ID терминов;
    • ids - получить только ID терминов;
    • names - получить только имена терминов.

    По умолчанию: 'all'

  • meta_query (массив)
    Параметры мета запроса. Смотрите WP_Meta_Query{}. С версии 4.4.

  • update_term_meta_cache (логический)
    Нужно ли перезагрузить/обновить кэш указанных элементов таксономии.
    Работает только когда параметр $fields равен all, all_with_object_id или term_id. С версии 4.4.
    По умолчанию: 'true'

Примеры

#1. Получим все элементы таксономии productcategories, к которым относится текущий пост ($post->ID):

$productcategories = wp_get_object_terms($post->ID, 'productcategories');

#2. Вернет список элементов таксономии "product", которые установлены для записи:

$product_terms = wp_get_object_terms($post->ID, 'product');
if( ! empty($product_terms)){
	if( ! is_wp_error($product_terms) ){
		echo '<ul>';
		foreach( $product_terms as $term ){
			echo '<li><a href="'. get_term_link($term) .'">'. $term->name .'</a></li>'; 
		}
		echo '</ul>';
	}
}

#3. Получает самый верхний элемент таксономии для указанного или текущего поста в цикле

Смотрите в третьем примере в описании функции get_the_terms()

Код wp get object terms: wp-includes/taxonomy.php WP 4.8.2

<?php
function wp_get_object_terms($object_ids, $taxonomies, $args = array()) {
	global $wpdb;

	if ( empty( $object_ids ) || empty( $taxonomies ) )
		return array();

	if ( !is_array($taxonomies) )
		$taxonomies = array($taxonomies);

	foreach ( $taxonomies as $taxonomy ) {
		if ( ! taxonomy_exists($taxonomy) )
			return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) );
	}

	if ( !is_array($object_ids) )
		$object_ids = array($object_ids);
	$object_ids = array_map('intval', $object_ids);

	$args = wp_parse_args( $args );

	/*
	 * When one or more queried taxonomies is registered with an 'args' array,
	 * those params override the `$args` passed to this function.
	 */
	$terms = array();
	if ( count( $taxonomies ) > 1 ) {
		foreach ( $taxonomies as $index => $taxonomy ) {
			$t = get_taxonomy( $taxonomy );
			if ( isset( $t->args ) && is_array( $t->args ) && $args != array_merge( $args, $t->args ) ) {
				unset( $taxonomies[ $index ] );
				$terms = array_merge( $terms, wp_get_object_terms( $object_ids, $taxonomy, array_merge( $args, $t->args ) ) );
			}
		}
	} else {
		$t = get_taxonomy( $taxonomies[0] );
		if ( isset( $t->args ) && is_array( $t->args ) ) {
			$args = array_merge( $args, $t->args );
		}
	}

	$args['taxonomy'] = $taxonomies;
	$args['object_ids'] = $object_ids;

	// Taxonomies registered without an 'args' param are handled here.
	if ( ! empty( $taxonomies ) ) {
		$terms = array_merge( $terms, get_terms( $args ) );
	}

	/**
	 * Filters the terms for a given object or objects.
	 *
	 * @since 4.2.0
	 *
	 * @param array $terms      An array of terms for the given object or objects.
	 * @param array $object_ids Array of object IDs for which `$terms` were retrieved.
	 * @param array $taxonomies Array of taxonomies from which `$terms` were retrieved.
	 * @param array $args       An array of arguments for retrieving terms for the given
	 *                          object(s). See wp_get_object_terms() for details.
	 */
	$terms = apply_filters( 'get_object_terms', $terms, $object_ids, $taxonomies, $args );

	$object_ids = implode( ',', $object_ids );
	$taxonomies = "'" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "'";

	/**
	 * Filters the terms for a given object or objects.
	 *
	 * The `$taxonomies` parameter passed to this filter is formatted as a SQL fragment. The
	 * {@see 'get_object_terms'} filter is recommended as an alternative.
	 *
	 * @since 2.8.0
	 *
	 * @param array     $terms      An array of terms for the given object or objects.
	 * @param int|array $object_ids Object ID or array of IDs.
	 * @param string    $taxonomies SQL-formatted (comma-separated and quoted) list of taxonomy names.
	 * @param array     $args       An array of arguments for retrieving terms for the given object(s).
	 *                              See wp_get_object_terms() for details.
	 */
	return apply_filters( 'wp_get_object_terms', $terms, $object_ids, $taxonomies, $args );
}

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

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

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

wp_get_object_terms 11 комментариев
Вопросы 1 Все
  • Тимур

    Тимур, подскажите пожалуйста как мне например вывести список постов из рубрики таксономии ...какой-то аналог wp_list_page?

    -1
    Ответить5.6 лет назад #
  • Игорь

    Кама, подскажите, а сортировку по мету-полю эта функция не поддерживает?

    Ответить1.2 года назад #
    • Kama4464

      Нет, в коде этого нет, что немного странно, потому что meta_query есть ... Возможно в будущем добавят...

      Ответить1.2 года назад #
  • У меня вообще не стандартная ситуация и не могу понять в чем проблема...
    Я получаю через AJAX ID поста и проверяю какой рубрики он принадлежит с помощью этой функции (таксономия product_cat). Post ID в цикле проходит, например, три раза. Первых два функция возвращает WP_Error - Invalid taxonomy, и на последний раз только возвращает term IDs.

    [04-Jan-2017 14:05:54 UTC] compareid = 2399
    [04-Jan-2017 14:05:54 UTC] taxonomy = product_cat
    [04-Jan-2017 14:05:54 UTC] get_the_terms = WP_Error Object
    (
    	[errors] => Array
    		(
    			[invalid_taxonomy] => Array
    				(
    					[0] => Invalid taxonomy.
    				)
    
    		)
    
    	[error_data] => Array
    		(
    		)
    
    )

    Может кто в курсе, может кто сталкивался с подобным, подскажите в чем трабла?..
    В логе стоит "get_the_terms", но это сути не меняет. Обе возвращают ошибку при проходе в цикле foreach.

  • Сергей @

    Здравствуйте, помогите как избавиться от запятой?

    <?php 
    $filtr = new WP_Query( array( 'post_type' => 'video') );
    while ( $filtr->have_posts() ) : $filtr->the_post();
    $top_term = get_top_term('video_category');         
    $product_terms = wp_get_post_terms($post->ID, 'video_category');
    ?>
    
    <div id="post-<?php the_ID(); ?>" class="col col-3 filtr-item no-padding" 
    data-category="<?php 
    $array = array();
    foreach($product_terms as $product_term) {
    echo $product_term->term_id . ',';
    } ?>">
    </div>
    
    <?php endwhile; ?>

    То есть выводит так 9,11,14,12,13, а нужно так 9,11,14,12,13
    побывал rtrim но в цикле он удаляет все запятые

    Ответить2 месяца назад #
    • Сергей @

      Может как то через массив?

      Ответить2 месяца назад #
      • campusboy1848 cайт: wp-plus.ru

        Привет. Попробуй так:

        <?php
        $filtr = new WP_Query( array( 'post_type' => 'video' ) );
        while ( $filtr->have_posts() ) : $filtr->the_post();
        	$top_term      = get_top_term( 'video_category' );
        	$product_terms = wp_get_post_terms( $post->ID, 'video_category' );
        
        	$data_category = array();
        	foreach ( $product_terms as $product_term ) {
        		$data_category[] = $product_term->term_id;
        	}
        	$data_category = implode( ',', $data_category );
        	?>
        
        	<div id="post-<?php the_ID(); ?>" class="col col-3 filtr-item no-padding"
        		 data-category="<?php echo $data_category; ?>">
        	</div>
        
        <?php endwhile; ?>
        2
        Ответить2 месяца назад #
  • роман @

    как вывести список категорий и подкатегорий из таблицы wp_term_taxonomy если у меня мультисайт - взять нужно из второго сайта и вывести в первый. база данных одна.
    пробовал различные функции, но ничего не выходит.
    wp_get_object_terms('3', 'ru_cat'); что не так делаю?

    весь код для вывода такой:

    Ответитьмесяц назад #
  • роман @

    как вывести список категорий и подкатегорий из таблицы wp_term_taxonomy если у меня мультисайт - взять нужно из второго сайта и вывести в первый. база данных одна.
    пробовал различные функции, но ничего не выходит.
    wp_get_object_terms('3', 'ru_cat'); что не так делаю?

    весь код для вывода такой:

    <?php $blogs = get_last_updated();
    foreach ($blogs AS $blog) {
    	switch_to_blog($blog["blog_id"]); bloginfo('name');
    
    wp_get_object_terms('', 'ru_cat');
    
    wp_list_pages('exclude=2,5');
    restore_current_blog();
    } ?>
    
    Ответитьмесяц назад #

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

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