term_exists() WP 3.0.0

Перевіряє, чи існує вказаний елемент таксономії (розділ). Якщо є, повертає ID або масив даних цього елемента.

З 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.0Converted to use get_terms() .

Код term_exists() WP 6.0.2

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 не 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 На array of arguments passed to get_terms().
	 * @param int | string $ term The term to check. Accepts term ID, slug, or name.
	 * @param string $taxonomy taxonomy name to use. An empty string indicates
	 * search is against all taxonomies.
	 * @param int|null $parent ID 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;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *