wp_delete_object_term_relationships()
Руйнує всі зв’язки об’єкта (пост, сторінка) з елементами зазначеної таксономії.
Видаляє всі зв’язки між усіма елементами зазначеної таксономії (термінами) та вказаним об’єктом (постом, сторінкою, посиланням, довільним типом запису тощо). Сам об’єкт таксономії (термін) при цьому не видаляється – руйнується лише зв’язок із ним.
За допомогою цієї функції, наприклад, можна видалити всі мітки у зазначеного посту, при цьому не видаляючи самих міток (тобто зруйнувати зв’язок поста та міток). Аналогічно її можна застосувати довільних таксономій.
Щоб видалити зв’язок об’єкта з певним елементом таксономії (а не з усіма одразу), використовуйте wp_remove_object_terms() .
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
є взагалі. Таким чином, ми розділимо всі пости на дві таксономії і пост буде перебувати або в музиці, або в композиторах.
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.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 ); } }