wp_set_object_terms() WP 2.3.0

Прикріплює пост (запис) до терміну (елемент таксономії). Наприклад, можна помістити пост у цю категорію. Створює терміни, якщо їх немає.

Потрібно, щоб термін був у зазначеній таксономії. Немає сенсу вказувати термін(и), якщо суворо не визначити до якої таксономії він відноситься.

Важливо: якщо в $terms вказуються ID, або масив з ID, то переконайтеся, що змінні передаються як числа (тип int), а не як рядки! Тому що рядки у вигляді числа, наприклад, '98'інтерпретуватимуться як назва терміна, а не його ID!

Використовуйте 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, то переконайтеся, що змінні передаються як числа (тип int), а не як рядки! Тому що рядки у вигляді числа, наприклад, '98'інтерпретуватимуться як назва терміна, а не його ID!

$taxonomy
(рядок) (обов’язковий)
Таксономія до якої належать зазначені терміни, які слід пов’язати із записом.

Наприклад:
category,
post_tagабо назва довільної таксономії.
$append
(логічний)

Додати зв’язок або встановити новий:

  • false (за замовчуванням) – старий зв’язок запису з термінами буде розірваний і встановлений зв’язок з новими (зазначеними) термінами.
  • true – старі зв’язки залишаться (заміняться при збігу) і додадуться нові вказані зв’язки.
    Типово: false

Приклади

0

#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() створить рубрики з такими назвами, а не прикріпить запис до терміну…

0

#2 Видалимо запис зі всіх рубрик

Якщо потрібно видалити запис 42 з усіх рубрик (навіть встановлений за замовчуванням):

wp_set_object_terms( 42, NULL, 'category' );
0

#3 Створимо мітки та помістимо в них запис

Цей приклад створює мітки метка1і метка2якщо таких міток немає і поміщає в ці мітки запис 54:

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

#4 Суворіша функція встановлення терміну для посту

Щоб не перейматися тим, що поточна функція може створити термін якщо його немає і якої при цьому обов’язково потрібно вказувати таксономію, навіть якщо ми передаємо ID термінів.

Вся ця магія лише ускладнює код. Тому в одному зі своїх проектів я написав наступну функцію, з якою простіше та зрозуміліше працювати.

Цій функції потрібно передати ID посту та ID терміна/термінів до яких ми хочемо прикріпити пост. Таксономію вказувати не потрібно. Якщо зазначеного терміна немає, то функції просто пропустить його, нічого не створюючи. Якщо вказано ID термінів із різних таксономій – ви отримаєте помилку.

/**
 * Sets specified terms for the specified posts.
 * Wrapper for wp_set_object_terms(). Its strict variant where you
 * Потрібно до specify $term_ids як номери і не потрібно для specify taxonomy.
 *
 * @param int $post_id
 * @param int[]|int $term_ids
 * @param bool $append
 *
 * @return int[]|WP_Error
 */
function strict_set_post_terms( $post_id, $term_ids, $append = true ){

	$post_id = (int) $post_id;
	$term_ids = array_filter( array_map( 'intval', (array) $term_ids ) );

	if( ! $post_id ){
		return new WP_Error( 'error', '$post_id no specified.' );
	}
	if( ! $term_ids ){
		return new WP_Error( 'error', '$term_ids не specified.' );
	}

	$taxonomy = '';

	// check terms
	foreach( $term_ids as $index => $term_id ){

		$ term = get_term ($ term_id);

		if( ! $term ){
			unset($term_ids[$index]);
		}
		if( $taxonomy && $taxonomy !== $term->taxonomy ){
			New WP_Error( 'error', 'Terms from different taxonomies are specified.' );
		}

		$taxonomy = $term->taxonomy;
	}

	$res = wp_set_object_terms( $post_id, $term_ids, $taxonomy, $append );

	if( ! is_wp_error( $res ) ){
		$res = array_map( 'intval', $res);
	}

	return $res;
}

нотатки

  • Global. wpdb. $wpdb WordPress database abstraction object.

список змін

З версії 2.3.0Введено.

Код wp_set_object_terms() WP 6.0.2

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 ( '' === trim( $term ) ) {
			continue;
		}

		$ term_info = term_exists ($ term, $ taxonomy);

		if ( ! $term_info ) {
			// 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 object-term relationship is added.
		 *
		 * @ Since 2.9.0
		 * @since 4.7.0 Added `$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 object-term relationship is added.
		 *
		 * @ Since 2.9.0
		 * @since 4.7.0 Added `$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_ ;
			$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( (int) $tt_id, $final_tt_ids, true ) ) {
				$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 " . implode( ',', $values ​​) . ' ON DUPLICATE KEY UPDATE )' ) ) {
				return new WP_Error( 'db_insert_error', __( 'Could not insert term relationship into 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 На array of object term IDs or slugs.
	 * @param array $tt_ids На array of term taxonomy IDs.
	 * @param string $taxonomy Taxonomy slug.
	 * @param bool $append Whether to append нові терміни до останніх термінів.
	 * @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;
}

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

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