wp_delete_object_term_relationships()
Разрушает все связи объекта (пост, страница) с элементами указанной таксономии(й).
Удалит все связи между всеми элементами указанной таксономии (терминами) и указанным объектом (постом, страницей, ссылкой, произвольным типом записи и т.д.). Сам объект таксономии (термин) при этом не удаляется - разрушается только связь с ним.
С помощью этой функции, например, можно удалить все метки у указанного поста, при этом не удаляя самих меток (т.е. разрушить связь поста и меток). Аналогично её можно применить для произвольных таксономий.
Чтобы удалить связь объекта с определенным элементом таксономии (а не со всеми сразу), используйте wp_remove_object_terms().
Хуков нет.
Возвращает
null
. Ничего не возвращает.
Использование
<?php wp_delete_object_term_relationships( $object_id, $taxonomies ); ?>
- $object_id(число) (обязательный)
- ID объекта, связи которого с таксономией нужно разрушить. Объектом может быть ID поста, страницы, вложения и т.д.
- $taxonomies(строка/массив) (обязательный)
- Название таксономии или список названий таксономий, связь с которой нужно разрушить.
Примеры
#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 );
#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 ); } }
#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 delete object term relationships WP 6.6.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 ); } }