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

term_exists()WP 3.0.0

Проверяет существует ли указанный элемент таксономии (раздел). Если существует, возвращает ID или массив данных этого элемента.

C WP 6.0. функция работает с кэшем и использует get_terms().

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

1 раз — 0.000419 сек (быстро) | 50000 раз — 14.74 сек (медленно) | PHP 7.0.14, WP 4.7
Хуки из функции

Возвращает

Разное.

  • Строку — term_id в виде строки — когда таксономия не указана и термин найден. Пр: term_exists( 395 ) > string(3) "395".

  • Массив — когда таксономия указана и термин найден:

    [
    	'term_id' => 'term id',
    	'term_taxonomy_id' => 'taxonomy id'
    ]
  • null — когда термина не существует.

  • 0 — когда в функцию указан 0 вместо ID термина.

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

term_exists( $term, $taxonomy, $parent );
$term(строка/число) (обязательный)

Термин, который нужно проверить. Можно указывать название, альтернативное название (slug) или ID.

Если указывается ID, то значение должно быть типа "число", а не "строка" в виде числа. Например 12 а не '12'.

$taxonomy(строка)
Название таксономии с которой будет работать функция. Указывать не обязательно.
По умолчанию: ''
$parent(строка/число)
ID родительского раздела, под которым предполагается искать указанный элемент таксономии.
По умолчанию: null

Примеры

0

#1 Проверка, существует ли термин (в любой таксономии)

$term = term_exists( 'miscellaneous' );
// вернет ID элемента таксономии со slug-ом 'miscellaneous'

$term = term_exists( 'Мужская одежда' );
// вернет ID элемента таксономии с названием 'Мужская одежда'
0

#2 Проверка, существует ли термин (в указанной таксономии)

Проверка, существует ли термин таксономии my_tax:

$term = term_exists( 'Мужская одежда', 'my_tax' );
// Вернет массив
//    [term_id] => 80
//    [term_taxonomy_id] => 84

// ID элемента таксономии
echo $term['term_id'];

// ID элемента таксономии в структуре таксономий
echo $term['term_taxonomy_id'];

Проверка существования категории Uncategorized:

$term = term_exists( 'Uncategorized', 'category' );

if ( $term !== 0 && $term !== null ) {
	echo 'Uncategorized category exists!';
}
0

#3 С WP 6.0 term_exists() кэшируется

Поэтому для кода который использует эту функцию необходимо убедиться, что term_exists() получает некэшированный результат, есть два способа сделать это:

1) Используя новый фильтр term_exists_default_query_args:

$callback = function ( $args ) {
   $args['cache_domain'] = microtime();
};

add_filter( 'term_exists_default_query_args',  $callback );

$check = term_exists( 123, 'category' );

remove_filter( 'term_exists_default_query_args',  $callback );

2) Использование wp_suspend_cache_invalidation():

wp_suspend_cache_invalidation( true );

$check = term_exists( 123, 'category' );

wp_suspend_cache_invalidation( false );

Подробнее читайте здесь: https://make.wordpress.org/core/2022/04/28/taxonomy-performance-improvements-in-wordpress-6-0/

Заметки

  • Global. true|false. $_wp_suspend_cache_invalidation

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

С версии 3.0.0 Введена.
С версии 6.0.0 Converted to use get_terms().

Код term_exists() WP 6.1.1

function term_exists( $term, $taxonomy = '', $parent = null ) {
	global $_wp_suspend_cache_invalidation;

	if ( null === $term ) {
		return null;
	}

	$defaults = array(
		'get'                    => 'all',
		'fields'                 => 'ids',
		'number'                 => 1,
		'update_term_meta_cache' => false,
		'order'                  => 'ASC',
		'orderby'                => 'term_id',
		'suppress_filter'        => true,
	);

	// Ensure that while importing, queries are not cached.
	if ( ! empty( $_wp_suspend_cache_invalidation ) ) {
		// @todo Disable caching once #52710 is merged.
		$defaults['cache_domain'] = microtime();
	}

	if ( ! empty( $taxonomy ) ) {
		$defaults['taxonomy'] = $taxonomy;
		$defaults['fields']   = 'all';
	}

	/**
	 * Filters default query arguments for checking if a term exists.
	 *
	 * @since 6.0.0
	 *
	 * @param array      $defaults An array of arguments passed to get_terms().
	 * @param int|string $term     The term to check. Accepts term ID, slug, or name.
	 * @param string     $taxonomy The taxonomy name to use. An empty string indicates
	 *                             the search is against all taxonomies.
	 * @param int|null   $parent   ID of parent term under which to confine the exists search.
	 *                             Null indicates the search is unconfined.
	 */
	$defaults = apply_filters( 'term_exists_default_query_args', $defaults, $term, $taxonomy, $parent );

	if ( is_int( $term ) ) {
		if ( 0 === $term ) {
			return 0;
		}
		$args  = wp_parse_args( array( 'include' => array( $term ) ), $defaults );
		$terms = get_terms( $args );
	} else {
		$term = trim( wp_unslash( $term ) );
		if ( '' === $term ) {
			return null;
		}

		if ( ! empty( $taxonomy ) && is_numeric( $parent ) ) {
			$defaults['parent'] = (int) $parent;
		}

		$args  = wp_parse_args( array( 'slug' => sanitize_title( $term ) ), $defaults );
		$terms = get_terms( $args );
		if ( empty( $terms ) || is_wp_error( $terms ) ) {
			$args  = wp_parse_args( array( 'name' => $term ), $defaults );
			$terms = get_terms( $args );
		}
	}

	if ( empty( $terms ) || is_wp_error( $terms ) ) {
		return null;
	}

	$_term = array_shift( $terms );

	if ( ! empty( $taxonomy ) ) {
		return array(
			'term_id'          => (string) $_term->term_id,
			'term_taxonomy_id' => (string) $_term->term_taxonomy_id,
		);
	}

	return (string) $_term;
}
3 комментария
    Войти