WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Шаблоны сайтов на русском

wp_set_object_terms() WP 2.3.0

Прикрепляет запись к термину (элементу таксономии). Например, с помощью этой функции можно поместить нужный пост в указанную категорию. Умеет создавать термины, если их нет.

Нужно чтобы термин был в указанной таксономии. Нет смысла указывать термин(ы), если строго не определить к какой таксономии он(и) относится.

Чтобы наоборот, удалить запись из терминов, используйте wp_remove_object_terms()

Является основой для: wp_set_post_terms()
Хуки из функции
Возвращает

Массив/WP_Error. Массив ID терминов, к которым были прикреплены записи. В случае ошибки вернет WP_Error объект.

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

wp_set_object_terms( $object_id, $terms, $taxonomy, $append );
$object_id(число) (обязательный)
ID записи, которую нужно связать с термином.
По умолчанию: нет
$terms(строка/массив/число) (обязательный)

Название, ярлык или ID элемента таксономии, который нужно установить или создать и установить для записи.

Функция создаст новый термин, если не найдет подходящий.

  • Если указать название (в кириллице), то функция создаст термин. При этом: название будет названием, слаг слагом (обработается как обычно).

Важно: если передается ID, или массив из ID, то убедитесь, что переменные передаются как числа, а не как строки! Потому что строки в виде числа, например, '98' будут интерпретироваться как название термина, а не его ID!

По умолчанию: нет

$taxonomy(строка) (обязательный)
Таксономия к которой принадлежат указанные термины, которые нужно связать с записью.
Например: category, post_tag или название произвольной таксономии.
По умолчанию: нет
$append(логический)

Добавить связь или установить новую:

  • false (по умолчанию) - старая связь записи с терминами будет разорвана и установлена связь с новыми (указанными) терминами.
  • true - старые связи останутся (будут заменены при совпадении) и добавятся новые указанные связи.
    По умолчанию: false

Примеры

1. Поместим запись в указанные рубрики

Пример, показывающий как добавить запись 42 в категории 6 и 8:

$cat_ids = array( 6, 8 );
// чтобы убедится, что термины переданы как числа:
// $cat_ids = array_map('intval', $cat_ids );
wp_set_object_terms( 42, $cat_ids, 'category' );

Если ID терминов указаны как строки, то wp_set_object_terms() создаст рубрики с такими названиями, а не прикрепит запись к термину...

2. Удалим запись из всех рубрик

Если нужно удалить запись 42 из всех рубрик (даже которая установлена по умолчанию):

wp_set_object_terms( 42, NULL, 'category' );

#3. Создадим метки и поместим в них запись

Этот пример создает метки метка1 и метка2, если таких меток нет и помещает в эти метки запись 54:

wp_set_object_terms( 54, array('метка1','метка2'), 'post_tag' );

Код wp set object terms: wp-includes/taxonomy.php VER 5.1.1

<?php
function wp_set_object_terms( $object_id, $terms, $taxonomy, $append = false ) {
	global $wpdb;

	$object_id = (int) $object_id;

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

	if ( ! is_array( $terms ) ) {
		$terms = array( $terms );
	}

	if ( ! $append ) {
		$old_tt_ids = wp_get_object_terms(
			$object_id,
			$taxonomy,
			array(
				'fields'                 => 'tt_ids',
				'orderby'                => 'none',
				'update_term_meta_cache' => false,
			)
		);
	} else {
		$old_tt_ids = array();
	}

	$tt_ids     = array();
	$term_ids   = array();
	$new_tt_ids = array();

	foreach ( (array) $terms as $term ) {
		if ( ! strlen( trim( $term ) ) ) {
			continue;
		}

		if ( ! $term_info = term_exists( $term, $taxonomy ) ) {
			// Skip if a non-existent term ID is passed.
			if ( is_int( $term ) ) {
				continue;
			}
			$term_info = wp_insert_term( $term, $taxonomy );
		}
		if ( is_wp_error( $term_info ) ) {
			return $term_info;
		}
		$term_ids[] = $term_info['term_id'];
		$tt_id      = $term_info['term_taxonomy_id'];
		$tt_ids[]   = $tt_id;

		if ( $wpdb->get_var( $wpdb->prepare( "SELECT term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id = %d", $object_id, $tt_id ) ) ) {
			continue;
		}

		/**
		 * Fires immediately before an object-term relationship is added.
		 *
		 * @since 2.9.0
		 * @since 4.7.0 Added the `$taxonomy` parameter.
		 *
		 * @param int    $object_id Object ID.
		 * @param int    $tt_id     Term taxonomy ID.
		 * @param string $taxonomy  Taxonomy slug.
		 */
		do_action( 'add_term_relationship', $object_id, $tt_id, $taxonomy );
		$wpdb->insert(
			$wpdb->term_relationships,
			array(
				'object_id'        => $object_id,
				'term_taxonomy_id' => $tt_id,
			)
		);

		/**
		 * Fires immediately after an object-term relationship is added.
		 *
		 * @since 2.9.0
		 * @since 4.7.0 Added the `$taxonomy` parameter.
		 *
		 * @param int    $object_id Object ID.
		 * @param int    $tt_id     Term taxonomy ID.
		 * @param string $taxonomy  Taxonomy slug.
		 */
		do_action( 'added_term_relationship', $object_id, $tt_id, $taxonomy );
		$new_tt_ids[] = $tt_id;
	}

	if ( $new_tt_ids ) {
		wp_update_term_count( $new_tt_ids, $taxonomy );
	}

	if ( ! $append ) {
		$delete_tt_ids = array_diff( $old_tt_ids, $tt_ids );

		if ( $delete_tt_ids ) {
			$in_delete_tt_ids = "'" . implode( "', '", $delete_tt_ids ) . "'";
			$delete_term_ids  = $wpdb->get_col( $wpdb->prepare( "SELECT tt.term_id FROM $wpdb->term_taxonomy AS tt WHERE tt.taxonomy = %s AND tt.term_taxonomy_id IN ($in_delete_tt_ids)", $taxonomy ) );
			$delete_term_ids  = array_map( 'intval', $delete_term_ids );

			$remove = wp_remove_object_terms( $object_id, $delete_term_ids, $taxonomy );
			if ( is_wp_error( $remove ) ) {
				return $remove;
			}
		}
	}

	$t = get_taxonomy( $taxonomy );
	if ( ! $append && isset( $t->sort ) && $t->sort ) {
		$values       = array();
		$term_order   = 0;
		$final_tt_ids = wp_get_object_terms(
			$object_id,
			$taxonomy,
			array(
				'fields'                 => 'tt_ids',
				'update_term_meta_cache' => false,
			)
		);
		foreach ( $tt_ids as $tt_id ) {
			if ( in_array( $tt_id, $final_tt_ids ) ) {
				$values[] = $wpdb->prepare( '(%d, %d, %d)', $object_id, $tt_id, ++$term_order );
			}
		}
		if ( $values ) {
			if ( false === $wpdb->query( "INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id, term_order) VALUES " . join( ',', $values ) . ' ON DUPLICATE KEY UPDATE term_order = VALUES(term_order)' ) ) {
				return new WP_Error( 'db_insert_error', __( 'Could not insert term relationship into the database.' ), $wpdb->last_error );
			}
		}
	}

	wp_cache_delete( $object_id, $taxonomy . '_relationships' );
	wp_cache_delete( 'last_changed', 'terms' );

	/**
	 * Fires after an object's terms have been set.
	 *
	 * @since 2.8.0
	 *
	 * @param int    $object_id  Object ID.
	 * @param array  $terms      An array of object terms.
	 * @param array  $tt_ids     An array of term taxonomy IDs.
	 * @param string $taxonomy   Taxonomy slug.
	 * @param bool   $append     Whether to append new terms to the old terms.
	 * @param array  $old_tt_ids Old array of term taxonomy IDs.
	 */
	do_action( 'set_object_terms', $object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids );
	return $tt_ids;
}

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

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

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

10 комментов
  • petrozavodsky775 cайт: alkoweb.ru

    а как от определенной рубрики открепить запись?

    Ответить5.2 лет назад #
    • Kama7363

      Задайте в этой функции новую рубрики и не трогайте параметр $append, запись будет удалена из старой и добавлена в новую.

      Ответить5.2 лет назад #
  • Антон

    Если передаю массив из названий терминов (кириллица) одной таксономии, то создается один термин с названием из их названий через запятую. Я так понимаю несколько терминов можно если передавать их id, а можно как-то с названиями это сделать?
    Так как термины создаются пользователями и их id ещё нет.

    Ответить2.8 года назад #
    • Kama7363

      Попробовал такой код:

      wp_set_object_terms( 1, array('один','два'), 'post_tag' );

      В итоге создалось 2 метки с названиями 'один' и 'два' и к ним был прекреплен пост с ID 1... Т.е. вы что-то не то говорите, покажите код...

      Ответить2.8 года назад #
  • Cкажите почему эта функция в functions.php не всегда работает.
    Пишет неверная таксономия, а при вызове в файлах темы уже верная.

    Ответитьгод назад #
    • @ campusboy3276 cайт: www.youtube.com/c/wpplus

      Если её напрямую вызывать в functions.php, то на этот момент ещё не успели таксономии зарегистрироваться, а регистрируются они на хуке init с приоритетом по умолчанию 0 для дефолтных такс или любым для произвольных такс (тут решает сам разработчик). А значит и функцию wp_set_object_terms() надо вызывать на этом же хуке, чтобы они "увидела таксономии", желательно с большим приоритетом.

      2
      Ответитьгод назад #
  • Добрый день Тимур.
    Непонятная проблема. вставляю запись

    $anketID = wp_insert_post(  wp_slash( array(
    		'comment_status' => 'open',  
    		'ping_status'    => 'closed',
    		'post_author'    => get_current_user_id(),       
    		'post_status'    => 'draft', 
    		'post_title'     => $girlname,
    		'post_type'      => 'profile',
    		'tax_input' => array( 'types' =>  'girls' ), 
    	) ) );
    

    затем

    if($anketID) 
    	{
    		wp_set_object_terms( $anketID, 'girls', 'types');
    ....
    

    и через несколько строк публикую запись, (попробовал через wp_update_post, wp transition post status, wp_publish_post) в таксах каунтер показывает что записи в термине стало больше на 1, но в самом странице термина, запись не появляется до тех пор, пока в ручную не обновить запись.

    Ответить4 мес назад #
    • Попробывал без 'tax_input' => array( 'types' => 'girls' ), этой строки,
      wp_set_post_terms, с массивами, с массивами ID, все варианты короче

      Ответить4 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться