Как удалить 1600 пользователей и 2500 постов?

10

Пару лет назад я настроил сайт с Drupal 6.9, а потом забыл об этом. У меня 160 страниц пользователей, которые являются спамерами, и мне нужно удалить все, кроме 3. Делать эту одну страницу за раз мучительно медленно из-за вызовов MySQL (я полагаю). У меня также есть около 2500 сообщений на форуме для удаления.

Я немного боюсь удалять записи из базы данных напрямую.

Я видел модуль под названием «массовое удаление», но он для Drupal версии 5 и недоступен для версии 6.

Джон Р
источник

Ответы:

17

Вы можете использовать Views Bulk Operations , модуль, который позволяет выполнять массовые операции над узлами, пользователями, комментариями; он также позволяет применять выбранную операцию ко всем узлам, пользователям или комментариям с помощью Batch API . Пакетный API позволяет распределять обработку форм по нескольким запросам страниц, таким образом гарантируя, что обработка не прерывается из-за тайм-аута PHP, и в то же время позволяет пользователю получать отзывы о ходе текущих операций.

киамлалуно
источник
1
Выбор всех элементов для удаления, опять же, мучительно медленный - в настройках VBO View есть параметр, позволяющий включить select allкнопку, которая выбирает все элементы на всех страницах - нажмите ее и убейте их!
AyeshK
3

Этот способ убить узлы очень медленный, но самый безопасный

function MYMODULE_menu(){
  $items['admin/mymodule/killnodes/%'] = array(
      'title' => 'Kill nodes',
      'page callback' => 'kill_nodes',
      'page arguments' => array(3),
      'type' => MENU_CALLBACK,
      'access arguments' => array('administer site configuration'),
  );
  return $items;
}

function kill_nodes($type){
  $query = "SELECT node.nid AS nid FROM {node} node WHERE node.type IN ('%s')";
  $result = db_query($query, $type);
  $count = 0;
  while($row = db_fetch_object($result)){
    node_delete($row->nid);
    $count++;
  }
  $message = t('!count nodes has been killed. Pif-Paf!', array('!count' => $count));
  drupal_set_message($message);
  return t("That's all folks");
}

Для пользователей, вы можете программно определить пользователя, которого вы хотите удалить? Если это возможно, вы можете использовать предыдущую функцию в качестве примера для удаления нежелательных пользователей.

dobeerman
источник
3
Я бы предложил обернуть это пакетным API-пакетом, чтобы предотвратить его истечение.
Расшифровка
Точно. Это простой пример.
Доберман
3

Вместо того, чтобы создавать собственный модуль для этой задачи, вы можете использовать простой скрипт и выполнить его с помощью Drush . Поскольку вам нужно обрабатывать большое количество пользователей и узлов, рекомендуется использовать пакетный API (и его можно использовать с Drush ).

Пьер Буйль
источник
2

Если, как и я, вы предпочитаете подход Python (возможно, редко здесь, но все же), это прозрачный и эффективный способ решения этой проблемы:

import os

# Build up a variable containing the usernames
# This list was built using drush sql-cli, then
# SELECT name FROM users 
#   where $your-where-condition 
#   order by uid asc 
#   INTO 
#     OUTFILE '/tmp/users.csv' 
#     FIELDS TERMINATED BY ',' 
#     ENCLOSED BY '"' 
#     lines terminated by ', ' ;
users = [result from SQL goes here]

for user in users:
    print("Deleting spam user: %s..." % user),
    os.system('drush --yes -r $your-path-to-drupal -l $your-site-url user-cancel --delete-content %s > /dev/null' % user) 
    print 'Done'

Шаги в основном:

  1. Войдите в свою БД с drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. Запустите приведенный выше SQL с вашим собственным условием where и вставьте результаты в переменную users.
  3. Обновите ваш путь и имя сайта в команде drush
  4. Запустите скрипт с python delete-users.py

Я уверен, что есть лучший способ сделать это, но это мое взломанное решение, которое работает хорошо.

mlissner
источник
1
Вы можете сделать это как однострочник тоже. for i in `drush sql-query 'SELECT list of usernames'`; do drush --yes user-cancel --delete-content $i; done,
Дэвид Л
1

Попробуйте эти 2 модуля для D6:

Пользователь Чернослив https://drupal.org/project/user_prune и Пользователь Удалить https://drupal.org/project/user_delete

User Prune позволяет массово удалять неактивных пользователей на основе указанных вами критериев.

Удаление пользователя позволяет удалить пользователя и удалить весь отправленный контент, включая узлы и комментарии.

FreeScholar
источник
1

Я реализовал пользовательский модуль для удаления всех пользователей indrupal 7. В области admin / people есть новая форма для завершения этой операции.

Тоже с толчком.

Это песочница проекта. Thk.

Ссылка на проект.

lgrtm
источник
1

Используйте продвинутый пользовательский модуль. Этот модуль добавляет вкладку «Дополнительно» на страницу управления пользователями. На этой вкладке вы можете фильтровать пользователей по любому атрибуту (роли, статусу и т. Д.) И выбирать все. Если вы выберете метод удаления пользователей как удалить пользователя и удалить весь контент, вы также можете удалить весь контент, созданный ими.

Синан Эрдем
источник
0

Если у вас есть доступ к Drush и вы хотите быстрое решение, которое позволит вам сохранить список пользователей и не требует установки дополнительных модулей:

drush @example.org sqlq "SELECT name FROM users WHERE name NOT IN ('keepthisuser1', 'andthisuser2')" | while read NAME; do
  drush -y @example.org user-cancel $NAME ; 
done

Обязательно настройте @example.orgсписок пользователей и список пользователей, чтобы сохранить ('keepthisuser1', 'andthisuser2')их выше, прежде чем вставлять копию :)

Крис Берджесс
источник
Это оставит хвосты, как пользовательские поля и все.
Никсмак
1
Можете ли вы рассказать, что вы имеете в виду? Я только что проверил это на последнем Drupal 7, и он не оставлял данные в пользовательских полях. Я не понимаю, что вы подразумеваете под "хвостами".
Крис Берджесс
1
Я вижу, что этот ответ дублирует аналогичный ответ, заключенный в Python выше.
Крис Берджесс
1
Я отменил свой голос по этому ответу, потому что на самом деле он работает как требуется. Рекомендовать @niksmac изменить голосование, чтобы проголосовать. Обратите внимание, что это не только ответ SQL, и он использует drush.
Кристиан
0

Модуль Delete All может пригодиться.

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

drush delete-all articles

или

drush delete-all users

Версия Drupal 6 в dev, но из заметок:

Все должно работать, кроме быстрого удаления.

Мауро Сарду
источник
0

Оригинальный вопрос для 6, но ответ Криса Берджесса может быть применен к Drupal 8 следующим образом;

drush sqlq "SELECT name FROM users_field_data WHERE name NOT IN ('admin')" | while read NAME; 
  do drush -y user:cancel --delete-content $NAME; 
done
Кристиан
источник