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