WordPress как на ладони
rgbcode is looking for WordPress developers.

wp_get_object_terms()WP 2.3.0

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

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

Это особенно полезно, если вы перебираете результаты постов в цикле, потому что WP_Query{} по умолчанию загружает все термины для запрашиваемых постов.

Заметка: этой функции можно передать несколько постов и несколько названий таксономий, чтобы получить все данные сразу, а get_the_terms() работает с одним постом и одной таксономией.

Работает на основе: get_terms()
1 раз — 0.003926 сек (очень медленно) | 50000 раз — 8.64 сек (быстро) | PHP 7.1.2, WP 4.8

Возвращает

WP_Term[]|int[]|Строку[]|Строку|WP_Error.

  • Массив объектов содержащих информацию о терминах. При ошибке вернет объект WP_Error.
  • array() - если элементы не найдены.
  • 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(строка)
    По какому критерию сортировать результат. Может быть:

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

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

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

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

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

    Также возможны комбинированные варианты, например:

    • id=>name - вернёт пару ID => Имя.
    • id=>slug - вернёт пару ID => Ярлык.

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

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

  • update_term_meta_cache(логический)
    Нужно ли обновить кэш метаданных полученных элементов таксономии. С версии 4.4.
    По умолчанию: false (до WP 6.3 был true)

Примеры

0

#1 Все элементы таксономии 'productcategories' поста

Получим термины таксономии productcategories текущего поста ($post->ID):

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

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

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

if( $product_terms && ! is_wp_error( $product_terms ) ){

	$lis = [];
	foreach( $product_terms as $term ){
		$lis[] = '<li><a href="'. get_term_link( $term ) .'">'. $term->name .'</a></li>';
	}

	echo '<ul>'. implode( "\n", $lis ) .'</ul>';
}
0

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

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

Список изменений

С версии 2.3.0 Введена.
С версии 4.2.0 Added support for 'taxonomy', 'parent', and 'term_taxonomy_id' values of $orderby. Introduced $parent argument.
С версии 4.4.0 Introduced $meta_query and $update_term_meta_cache arguments. When $fields is 'all' or 'all_with_object_id', an array of WP_Term objects will be returned.
С версии 4.7.0 Refactored to use WP_Term_Query, and to support any WP_Term_Query arguments.
С версии 6.3.0 Passing update_term_meta_cache argument value false by default resulting in get_terms() to not prime the term meta cache.

Код wp_get_object_terms() WP 6.4.3

function wp_get_object_terms( $object_ids, $taxonomies, $args = array() ) {
	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 );

	$defaults = array(
		'update_term_meta_cache' => false,
	);

	$args = wp_parse_args( $args, $defaults );

	/**
	 * Filters arguments for retrieving object terms.
	 *
	 * @since 4.9.0
	 *
	 * @param array    $args       An array of arguments for retrieving terms for the given object(s).
	 *                             See {@see wp_get_object_terms()} for details.
	 * @param int[]    $object_ids Array of object IDs.
	 * @param string[] $taxonomies Array of taxonomy names to retrieve terms from.
	 */
	$args = apply_filters( 'wp_get_object_terms_args', $args, $object_ids, $taxonomies );

	/*
	 * 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 ) && array_merge( $args, $t->args ) != $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_from_remaining_taxonomies = get_terms( $args );

		// Array keys should be preserved for values of $fields that use term_id for keys.
		if ( ! empty( $args['fields'] ) && str_starts_with( $args['fields'], 'id=>' ) ) {
			$terms = $terms + $terms_from_remaining_taxonomies;
		} else {
			$terms = array_merge( $terms, $terms_from_remaining_taxonomies );
		}
	}

	/**
	 * Filters the terms for a given object or objects.
	 *
	 * @since 4.2.0
	 *
	 * @param WP_Term[]|int[]|string[]|string $terms      Array of terms or a count thereof as a numeric string.
	 * @param int[]                           $object_ids Array of object IDs for which terms were retrieved.
	 * @param string[]                        $taxonomies Array of taxonomy names from which terms were retrieved.
	 * @param array                           $args       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 WP_Term[]|int[]|string[]|string $terms      Array of terms or a count thereof as a numeric string.
	 * @param string                          $object_ids Comma separated list of object IDs for which terms were retrieved.
	 * @param string                          $taxonomies SQL fragment of taxonomy names from which terms were retrieved.
	 * @param array                           $args       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 );
}
6 комментариев
    Войти