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