wp_delete_object_term_relationships()WP 2.3.0

Разрушает все связи объекта (пост, страница) с элементами указанной таксономии(й).

Удалит все связи между всеми элементами указанной таксономии (терминами) и указанным объектом (постом, страницей, ссылкой, произвольным типом записи и т.д.). Сам объект таксономии (термин) при этом не удаляется - разрушается только связь с ним.

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

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

Работает на основе: wp_remove_object_terms()

Хуков нет.

Возвращает

null. Ничего не возвращает.

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

<?php wp_delete_object_term_relationships( $object_id, $taxonomies ); ?>
$object_id(число) (обязательный)
ID объекта, связи которого с таксономией нужно разрушить. Объектом может быть ID поста, страницы, вложения и т.д.
$taxonomies(строка/массив) (обязательный)
Название таксономии или список названий таксономий, связь с которой нужно разрушить.

Примеры

0

#1 Удалим метки у поста

Допустим есть метки "один", "два", которые прикреплены к посту 567 и нам нужно убрать эту связь (удалить метки у поста):

<?php wp_delete_object_term_relationships( 567, 'post_tag' ); ?>

Удаление связей сразу нескольких терминов поста:

$post_id = 55;
$taxonomies = [ 'category', 'post_tag', 'custom_taxonomy' ];

wp_delete_object_term_relationships( $post_id, $taxonomies );
0

#2 Разделение записей между двумя таксономиями

Предположим, у нас 2 таксономии music и compositors и некоторые посты, которые находятся в терминах обоих этих таксономий. А нам нужно выбрать все посты, которые находятся в таксономии music и удалить их из таксономии compositors, если связь с compositors есть вообще. Таким образом, мы разделим все посты на две таксономии и пост будет находится либо в music, либо в compositors.

del_tax_rel( $leave_in = 'music', $del_from = 'compositors' );

function del_tax_rel( $leave_in, $del_from ) {
	global $wpdb;

	$sql = "SELECT p.ID, post_title
	FROM $wpdb->posts p
		JOIN $wpdb->term_relationships rel ON (rel.object_id = p.ID)
		JOIN $wpdb->term_taxonomy tx ON (rel.term_taxonomy_id = tx.term_taxonomy_id)
	WHERE p.post_status = 'publish'
		AND tx.taxonomy = '$leave_in'";
	$results = $wpdb->get_results( $sql );

	if( ! $results ){
		return false;
	}

	foreach( $results as $pst ){
		wp_delete_object_term_relationships( $pst->ID, $del_from );
	}
}
0

#3 Удалим запись из указанной рубрики

Удалим пост (запись) 10 из термина (рубрики) 1, т.е. разрушим связь указанного объекта (пост, страница, запись) с элементом таксономии:

$object_id = 10;
$delete_terms = [ 1 ];

global $wpdb;

if( $delete_terms ){

	$in_delete_terms = "'" . implode( "', '", $delete_terms ) . "'";

	do_action( 'delete_term_relationships', $object_id, $delete_terms );

	$wpdb->query( $wpdb->prepare( 
		"DELETE FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id IN ($in_delete_terms)", 
		$object_id 
	) );

	do_action( 'deleted_term_relationships', $object_id, $delete_terms );

	wp_update_term_count( $delete_terms, $taxonomy );
}

Можно указать несколько элементов таксономии: array(1,2,67).

Этот пример не совсем подходит к этой функции, но он похож, потому что тоже разрушает связь объекта с элементом таксономии. Отличие в том что тут разрушается связь только лишь с 1 или несколькими указными элементами, а функция wp_delete_object_term_relationships() разрушает вообще все связи с таксономией.

Заметки

  • Использует фильтр (действие) delete_term_relationships, срабатывает до удаления связи.

  • Использует фильтр (действие) deleted_term_relationships, срабатывает после удаления связи.

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

С версии 2.3.0 Введена.

Код wp_delete_object_term_relationships() WP 6.5.2

function wp_delete_object_term_relationships( $object_id, $taxonomies ) {
	$object_id = (int) $object_id;

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

	foreach ( (array) $taxonomies as $taxonomy ) {
		$term_ids = wp_get_object_terms( $object_id, $taxonomy, array( 'fields' => 'ids' ) );
		$term_ids = array_map( 'intval', $term_ids );
		wp_remove_object_terms( $object_id, $term_ids, $taxonomy );
	}
}