массовое удаление комментариев

11

как я могу удалить все комментарии сразу? Я видел, как это сделать с узлами и модулем массового удаления, Как удалить все узлы данного типа контента? но я смотрю на подобное решение для комментариев.

Я ищу решение, которое не оставляет артефактов в базе данных. Является ли Views Bulk Operations лучшим решением?

brian_d
источник

Ответы:

7

AFAIK, VBO должен быть в состоянии выполнить эту работу, но я сам не пытался удалить комментарии.

Другой способ - запустить некоторый код (в модуле или в блоке execute php модуля Devel), который получает список всех запросов из базы данных, создает массив идентификаторов комментариев и передает этот массив в функцию comment_delete_multiple . Обратите внимание, что это может занять некоторое время (в зависимости от производительности сервера и количества комментариев), поэтому вам, возможно, придется обойти это, например, с помощью set_time_limit (http://php.net/manual/en/function .set-time-limit.php) или пакетный API Drupal.

[обновление: см. ответ Криса Коэна для примера кода, основанного на этом подходе.]

marcvangend
источник
7

Это не альтернативный ответ, а скорее проработка Маркванджа, но я не смог прокомментировать его ответ и оставить пример кода. Таким образом, ручной подход, использующий блок кода выполнения devel, будет выглядеть примерно так:


$cids = db_select('comment', 'c')
  ->fields('c', array('cid'))
  ->execute()
  ->fetchCol();

comment_delete_multiple($cids);

Как указывает marcvangend, это будет ограничено временем выполнения на вашем сервере, поэтому вам нужно будет временно увеличить его, если у вас много комментариев. Спасибо Manarth и instanceofjamie за помощь.

Крис Коэн
источник
1
Спасибо за направление, но ваш синтаксис отключен. Таблица comment, вам нужен псевдоним и результаты необработанных объектов не могут быть переданы непосредственноcomment_delte_multiple
brian_d
@brian_d, как бы вы обработали необработанные результаты объекта, готовые для comment_delte_multiple ()?
Jackocnr
2

Лично я бы пошел для модуля Массовых операций Представлений .

Этот модуль расширяет представления, позволяя выполнять массовые операции с отображаемыми строками. Это делается путем показа флажка перед каждым узлом и добавления поля выбора, содержащего операции, которые можно применить. Можно использовать действия Drupal Core или Rules.

Карл Йоханн
источник
0

Честно говоря, когда мне нужно было сделать это, я просто сделал это в базе данных. Вы удаляете комментарии, исправляете статистику комментариев и пуф, все комментарии исчезли. Я бы избегал этого, если у вас есть модули, взаимодействующие с комментариями каким-то странным образом, в противном случае это то, что я бы предложил.

TRUNCATE TABLE комментарии

ОБНОВЛЕНИЕ node_comment_statistics SET comment_count = 0

G.Martin
источник
Я думаю, что преимущество использования вызова API drupal comment_delete_multipleсостоит в том, что он может вызывать для вас дополнительные ловушки drupal, делая вашу БД потенциально более чистой.
brian_d
Вот почему я сказал, что рекомендую избегать этого, если у вас есть модули, взаимодействующие с комментариями. В противном случае, если у вас есть комментарии на складе, я никогда не замечал никаких проблем с ним. Это, конечно, намного проще сделать, если у вас есть сайт, который получил спам с тысячами комментариев.
Г.Мартин
Вам также необходимо усечь таблицу 'field_data_comment_body', поскольку там хранится содержимое комментариев.
Крейндерс
0

Некоторые инструменты пользовательского интерфейса Вы можете установить модули ниже

Просмотры - drupal.org/project/views

Я считаю, что каждый сайт Drupal нужен ... Он генерирует SQL на бэкэнде и отображает результаты с настраиваемыми настройками, фильтрами, сортировкой, подкачкой страниц ... и т. Д.

VBO - http://drupal.org/project/views_bulk_operations Чтобы разрешить массовые операции (т.е. удалить комментарии для этой темы)

Администрирование Views - http://drupal.org/project/admin_views Воспользуйтесь преимуществами Views и VBO, замените оригинальный контнет, комментарий, страницы администрирования пользователей на menu_alter ...

  1. После включения вышеупомянутых модулей, вернитесь, чтобы комментировать страницу администратора
  2. Отметьте галочкой все ( будьте осторожны , убедитесь, что вы хотите удалить все комментарии ...)
  3. Выберите «Удалить» и «Отправить» ( будьте осторожны , больше не нажимайте кнопку подтверждения позже ...)
Ск Пун
источник
0

Достигнуто удаление около 45 000 комментариев с помощью модуля «Резервное копирование и миграция». В расширенной настройке «Исключить данные из следующих таблиц» - сначала нажмите клавишу Ctrl, затем выберите комментарий в списке - (будьте осторожны, поскольку здесь уже выбраны ненужные таблицы кэша) - резервное копирование - восстановление из этого файла резервной копии. Ура!

VivMajor
источник
0

Этот ответ аналогичен уже указанному в списке, но я изменил его, чтобы предотвратить «нехватку памяти» для около 27 000 комментариев. Это займет некоторое время, чтобы выполнить в зависимости от количества комментариев. Простое усечение таблицы комментариев не может быть хорошей идеей; Лучше всего, чтобы Drupal занимался удалением контента.

Я создал скрипт PHP:

$cids = db_select('comment', 'c')
  ->fields('c', array('cid'))
  ->execute()
  ->fetchCol();

foreach($cids as $cid)
{
  comment_delete($cid);
}

... затем запустил скрипт с Drush

drush @my_alias php-script my_script.php
Параг
источник
0

Обычно я бы рекомендовал использовать VBO для массового удаления комментариев или узлов, но если вы находитесь в ситуации, когда у вас есть сотни тысяч комментариев и у вас не так много времени, вот SQL-запрос, который удалит все неутвержденные комментарии вместе со всеми ревизиями и данными, относящимися к тем комментариям, которые в моем случае занимали 1,2 ГБ места в БД

DELETE c, rcb, dcb
FROM
    comment AS c
JOIN field_revision_comment_body AS rcb ON (c.cid = rcb.entity_id)
JOIN field_data_comment_body AS dcb ON (rcb.entity_id = dcb.entity_id)
WHERE
    c. STATUS = 0
Октан
источник
-2

Включите фильтр PHP и создайте базовую страницу со следующим кодом:

<?php
  db_query("TRUNCATE TABLE {comment}");
  db_query("UPDATE {node_comment_statistics} SET comment_count = 0");
?>
Jordi
источник
1
никогда не используйте PHP-фильтр для подобных вещей (даже для любой другой вещи, PHP-фильтр, как правило, является одной из худших идей в Drupal)
Алехандро Морено