Як видалити 1600 користувачів та 2500 публікацій?


10

Пару років тому я налаштував сайт з Drupal 6.9, а потім забув про нього. У мене 160 сторінок користувачів, які є всіма спамерами, і мені потрібно видалити всіх, крім 3. Робити цю одну сторінку одночасно болісно повільно через дзвінки MySQL (я думаю). У мене також є близько 2500 повідомлень на форумі, які потрібно видалити.

Я трохи боюся видаляти записи безпосередньо з бази даних.

Я побачив модуль під назвою "масове видалення", але він призначений для Drupal версії 5 та недоступний для версії 6.

Відповіді:


17

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


1
Вибір усіх елементів, які потрібно видалити, знову ж таки болісно повільний. У параметрах VBO View на екрані є налаштування, щоб увімкнути select allкнопку, що вибирає всі елементи на всіх сторінках - клацніть по ньому та вбийте все!
АйешК

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

Ви можете програмно визначити користувача, якого ви хочете видалити? Якщо можливо, ви можете використовувати попередню функцію як приклад, щоб видалити користувачів без потреби.


3
Я б запропонував завершити цю процедуру за допомогою пакету Batch API, щоб запобігти її вичерпанню.
Розшифруйте

Напевно. Це простий приклад.
dobeerman

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 вище з власним, де умова, і вставте результати в змінну користувачів.
  3. Оновіть свій шлях друпалу та назву сайту в команді drush
  4. Запустіть сценарій за допомогою python delete-users.py

Я впевнений, що є кращий спосіб зробити це, але це моє зламане рішення, яке працює добре.


1
Ви також можете це зробити як однолінійним. for i in `drush sql-query 'SELECT list of usernames'`; do drush --yes user-cancel --delete-content $i; done.
Девід Л

1

Спробуйте ці 2 модулі для D6:

Користувач Prune https://drupal.org/project/user_prune та видалити користувача https://drupal.org/project/user_delete

Користувач Prune дозволяє масово видаляти неактивних користувачів на основі визначених критеріїв.

Користувач Видалити дозволяє видалити користувача та видалити весь поданий вміст, включаючи вузли та коментарі


1

Я реалізував спеціальний модуль для видалення всіх користувачів indrupal 7. У області адмін / люди є нова форма для завершення цієї операції.

Занадто з барабаном.

Проект пісочниці. Думаю.

Посилання на проект.


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')вище, перш ніж вставляти копію :)


Це залишить хвости, як і поля користувачів, і всі.
niksmac

1
Чи можете ви розповісти, що ви маєте на увазі? Я тільки тестував це на останньому Drupal 7, і він не залишав даних у полях користувачів. Я не розумію, що ви маєте на увазі під «хвости».
Кріс Берджесс

1
Я бачу, що ця відповідь дублює аналогічну, загорнуту в Python нагорі.
Кріс Берджесс

1
Я повернув свій голос за цю відповідь, оскільки насправді це працює так, як потрібно. Рекомендуйте @niksmac змінити голос вниз, щоб проголосувати. Зауважте, що це не лише відповідь SQL і використовує друш.
Крістіан

0

Модуль « Видалити все» міг стати у нагоді.

Після встановлення ви можете зробити, наприклад:

drush delete-all articles

або

drush delete-all users

Версія Drupal 6 in in 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.