Удаление связей – функция wp_delete_object_term_relationships()

# WP_DELETE_OBJECT_TERM_RELATIONSHIPS() │ WP 2.3.0

Функция wp_delete_object_term_relationships() используется для удаления связей между объектом и терминами в таксономии (группировке терминов). Эта функция позволяет удалить все связи объекта с терминами определенной таксономии, но не удаляет сам термин или таксономию.

**Использует:** wp_remove_object_terms()

**Хуки:** Нет.

## Возв��ат

Функция ничего не возвращает (null).

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

```php
wp_delete_object_term_relationships( $object_id, $taxonomies );

Параметры

  • $object_id (int) (обязательный) — ID объекта, который ссылается на термин.
  • $taxonomies (string|array) (обязательный) — список имен таксономий или одно имя таксономии.

Примеры

Удаление тегов из поста

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

wp_delete_object_term_relationships( 567, 'post_tag' );

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

Предположим, у нас есть пост с ID 55 и мы хотим удалить связи с несколькими таксономиями:

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

wp_delete_object_term_relationships( $post_id, $taxonomies );

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

Допустим, у нас есть две таксономии: "музыка" и "композиторы", и некоторые посты находятся в обоих этих таксономиях. Мы хотим выбрать все посты из таксономии "музыка" и убрать их из таксономии "композиторы", если такая связь существует.

Таким образом, мы разделим все посты на две таксономии: пост будет находиться либо в "музыка", либо в "композиторы".

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

Удаление поста из категории

Давайте удалим пост с ID 10 из термина (категории) с ID 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 );
}

Вы можете указать несколько терминов таксономии в массиве: [ 1, 2, 67 ].

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

Изменения

С версии 2.3.0 — введена функция.

Код функции

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

Связанные функции

  • category_exists()
  • get_term()
  • get_term_by()
  • get_term_children()
  • get_terms()
  • wp_delete_term()
  • wp_get_object_terms()
  • wp_set_object_terms()

Эти функции работают с терминами и таксономиями и могут быть полезны при работе с wp_delete_object_term_relationships().

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *