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

term_exists() WP 3.0

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

✈ 1 раз = 0.000419с = быстро | 50000 раз = 14.74с = медленно PHP 7.0.14, WP 4.7

Хуков нет.

Возвращает

null/число/массив

  • ID элемента таксономии - если таксономия не указана и термин найден.

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

    array('term_id'=> 'term id', 'term_taxonomy_id'=> 'taxonomy id' )
  • 0/false - если термина не существует.

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

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

Примеры

#1. Различные примеры использования функции:

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

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

#2. Варианты с указанием таксономии:

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

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

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

Код term exists: wp-includes/taxonomy.php WP 4.8.2

<?php
function term_exists( $term, $taxonomy = '', $parent = null ) {
	global $wpdb;

	$select = "SELECT term_id FROM $wpdb->terms as t WHERE ";
	$tax_select = "SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE ";

	if ( is_int($term) ) {
		if ( 0 == $term )
			return 0;
		$where = 't.term_id = %d';
		if ( !empty($taxonomy) )
			return $wpdb->get_row( $wpdb->prepare( $tax_select . $where . " AND tt.taxonomy = %s", $term, $taxonomy ), ARRAY_A );
		else
			return $wpdb->get_var( $wpdb->prepare( $select . $where, $term ) );
	}

	$term = trim( wp_unslash( $term ) );
	$slug = sanitize_title( $term );

	$where = 't.slug = %s';
	$else_where = 't.name = %s';
	$where_fields = array($slug);
	$else_where_fields = array($term);
	$orderby = 'ORDER BY t.term_id ASC';
	$limit = 'LIMIT 1';
	if ( !empty($taxonomy) ) {
		if ( is_numeric( $parent ) ) {
			$parent = (int) $parent;
			$where_fields[] = $parent;
			$else_where_fields[] = $parent;
			$where .= ' AND tt.parent = %d';
			$else_where .= ' AND tt.parent = %d';
		}

		$where_fields[] = $taxonomy;
		$else_where_fields[] = $taxonomy;

		if ( $result = $wpdb->get_row( $wpdb->prepare("SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE $where AND tt.taxonomy = %s $orderby $limit", $where_fields), ARRAY_A) )
			return $result;

		return $wpdb->get_row( $wpdb->prepare("SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE $else_where AND tt.taxonomy = %s $orderby $limit", $else_where_fields), ARRAY_A);
	}

	if ( $result = $wpdb->get_var( $wpdb->prepare("SELECT term_id FROM $wpdb->terms as t WHERE $where $orderby $limit", $where_fields) ) )
		return $result;

	return $wpdb->get_var( $wpdb->prepare("SELECT term_id FROM $wpdb->terms as t WHERE $else_where $orderby $limit", $else_where_fields) );
}

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

Из метки: Условные теги (все)

Еще из раздела: Любые таксономии

term_exists 5 комментариев
  • Андрей

    Здравствуйте.
    Столкнулся с тем что данная функция не срабатывает, когда в имени терма присутствует символ амперсанда (&). Не информации как это поправить? Может как-то экранировать его...

    Аналогично функция get_terms.

    Ответить1.9 года назад #
    • Андрей

      Разобрался. Надо было имя терма прогнать через функцию htmlentities().

      1
      Ответить1.9 года назад #
    • Alio

      В таком случае, для верности, можно использовать поиск по слагу, а не по имени терма.

      $slug = sanitize_title( $имя_терма );
      $term = term_exists( $slug, 'имя_таксономии' );
      1
      Ответить1.5 года назад #
  • campusboy1832 cайт: wp-plus.ru

    А что лучше использовать, эту функцию или get_term_by?

    Ответить1.1 года назад #
    • Kama4486

      Это немного разные функции...

      • term_exists - получает ID термина (не все данные) и не работает с кэшем.
      • get_term_by - получает все данные термина (объект), не работает с кэшем, если указывается не ID термина, а ярлык или называние.
      • get_term - получает все данные термина (объект), всегда работает с кэшем.

      Я бы всегда юзал get_term, наверное, но там не очень удобно проверять результат, потому что там возвращается null если термина нет и WP_Error если указанной таксы нет... Иногда проще написать так:

      if ( ! term_exists( 'foo', $taxonomy ) ) {
      	// no no
      }

      Запрос там довольно быстрый, на этот счет особо париться не нужно.

      1
      Ответить1.1 года назад #

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

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