Пропоную увазі хук для видалення всіх дочірніх коментарів при видаленні коментаря, тобто ми видаляємо коментар і разом з ним видаляються всі його дочірні коментарі, і дочірні дочірніх, і так далі. Іншими словами, при видаленні коментаря віддалиться вся гілка відповідей на нього.

Щоб «видалення гілками» почало працювати вставляємо код в файл теми functions.php.

/ * Видалення всіх дочірніх коментарів (всього дерева) при видаленні коментаря
————————————————— ——————————— * /
add_action (‘delete_comment’, ‘del_child_comments_on_del_comment’);
function del_child_comments_on_del_comment ($ comment_id) {
global $ wpdb;

// Якщо немає дітей, повертаємо
if (! $ child_comments = $ wpdb-> get_col («s ELECT comment_ID FROM $ wpdb-> comments WHERE comment_parent = ‘$ comment_id'»))
return;

Пропоную увазі хук для видалення всіх дочірніх коментарів при видаленні коментаря, тобто ми видаляємо коментар і разом з ним видаляються всі його дочірні коментарі, і дочірні дочірніх, і так далі. Іншими словами, при видаленні коментаря віддалиться вся гілка відповідей на нього.

Щоб «видалення гілками» почало працювати вставляємо код в файл теми functions.php.

/ * Видалення всіх дочірніх коментарів (всього дерева) при видаленні коментаря
————————————————— ——————————— * /
add_action (‘delete_comment’, ‘del_child_comments_on_del_comment’);
function del_child_comments_on_del_comment ($ comment_id) {
global $ wpdb;

// Якщо немає дітей, повертаємо
if (! $ child_comments = $ wpdb-> get_col («s ELECT comment_ID FROM $ wpdb-> comments WHERE comment_parent = ‘$ comment_id'»))
return;

foreach ($ child_comments as $ val)
wp_delete_comment ($ val);
}

Ключові моменти хука: фільтр — delete_comment і функція — wp_delete_comment ():

Над кодом я просидів пристойно, бо тут використовується рекурсія, а вона часто шкідлива і я з нею не дуже …

У програмуванні рекурсія — виклик функції з неї ж самої (проста рекурсія) або через інші функції (складна або непряма рекурсія). Наприклад, функція A викликає функцію B, а функція B — функцію A. Кількість вкладених викликів функції або процедури називається глибиною рекурсії.

Сидів спочатку і пробував натурально використовувати рекурсію (написав функцію, повісив її на хук і викликав її з неї ж самої) — що треба не виходило, а код тільки зростав. В один момент, як тільки я пішов налити собі чайку, прийшла її величність Еврика і я все зрозумів: замикання буде відбуватися при спрацьовуванні хука delete_comment в момент чергових викликів функції wp_delete_comment () і не треба викликати функцію з функції в чистому вигляді, т.е . буде непряма рекурсія.

Чесно кажучи, погано можу собі уявити реальну ситуацію, на звичайному блозі, де б таке видалення коментарів було особливо потрібно. Однак, воно логічно і може комусь знадобиться. На цьому блозі я зробив саме так, тому що, якщо видалити коментар у якого є дочірні коментарі, то сенс дочірніх коментарів найчастіше буде просто втрачений: будуть коментарі не зрозуміло про що. Наводячи алегорію — це коментарі до посту, без самого поста. Думаю, мені таке тут не треба.
Переміщення в кошик

Після того, як завдання з видаленням була вирішена, второваною дорогою, я написав таке ж переміщення коментарів гілками в кошик і витяг їх гілками з кошика.

Принцип той же самий, тільки використовуються тепер фільтри: trash_comment, untrash_comment і функції: wp_trash_comment (), wp_untrash_comment ():

/ * Переміщення в кошик всіх дочірніх коментарів (вся глибина дерева), при видаленні коментаря
————————————————— ————————————————— * /
add_action (‘trash_comment’, ‘trash_child_comments_on_trash_comment’);
function trash_child_comments_on_trash_comment ($ comment_id) {
global $ wpdb;

// Якщо немає дітей, повертаємо
if (! $ child_comments = $ wpdb-> get_col («S ELECT comment_ID FROM $ wpdb-> comments WHERE comment_parent = ‘$ comment_id'»))
return;

foreach ($ child_comments as $ val)
wp_trash_comment ($ val);
}

add_action (‘untrash_comment’, ‘untrash_child_comments_on_untrash_comment’);
function untrash_child_comments_on_untrash_comment ($ comment_id) {
global $ wpdb;

// Якщо немає дітей, повертаємо
if (! $ child_comments = $ wpdb-> get_col («S ELECT comment_ID FROM $ wpdb-> comments WHERE comment_parent = ‘$ comment_id'»))
return;

foreach ($ child_comments as $ val)
wp_untrash_comment ($ val);
}

Спрощена запис переміщення в корзину

Ось вельми цікавий код, для тек хто розбирається в php: спрощена версія записи для коду вище (для кошика). Тут цікаво подивитися як можна використовувати функцію current_filter () і незвичайний виклик функції PHP, динамічний, з використанням змінної ($ use_function ($ val)). Загалом, дивіться самі:

/ * Переміщення в кошик всіх дочірніх коментарів (вся глибина Дереса), при видаленні коментаря
————————————————— ————————————————— * /
add_action (‘trash_comment’, ‘trash_untrash_child_comments_with_parent’);
add_action (‘untrash_comment’, ‘trash_untrash_child_comments_with_parent’);
function trash_untrash_child_comments_with_parent ($ comment_id) {
global $ wpdb;

// Якщо немає дітей, повертаємо
if (! $ child_comments = $ wpdb-> get_col («S ELECT comment_ID FROM $ wpdb-> comments WHERE comment_parent = ‘$ comment_id'»))
return;

foreach ($ child_comments as $ val) {
// Отримаємо wp_trash_comment або wp_untrash_comment
$ Use_function = ‘wp_’. current_filter ();
$ Use_function ($ val);
}
}