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є взагалі. Таким чином, ми розділимо всі пости на дві таксономії і пост буде перебувати або в музиці, або в композиторах.

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.0.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 );
	}
}

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

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