จะลบผู้ใช้ 1600 คนและ 2,500 โพสต์ได้อย่างไร


10

สองสามปีที่ผ่านมาฉันกำหนดค่าไซต์ด้วย Drupal 6.9 แล้วฉันก็ลืมมันไป ฉันมีผู้ใช้ 160 คนที่เป็นสแปมเมอร์และฉันต้องลบทั้งหมดยกเว้น 3. การทำอย่างนี้ทีละหน้าช้าลงอย่างเจ็บปวดเนื่องจากการเรียก MySQL (ฉันเดา) ฉันยังมีการลบฟอรัมประมาณ 2,500 โพสต์

ฉันกลัวที่จะลบระเบียนออกจากฐานข้อมูลโดยตรง

ฉันเห็นโมดูลที่เรียกว่า "มวลลบ" แต่สำหรับ Drupal เวอร์ชัน 5 และไม่สามารถใช้ได้กับรุ่น 6

คำตอบ:


17

คุณสามารถใช้Views Bulk Operationsซึ่งเป็นโมดูลที่อนุญาตให้เรียกใช้การดำเนินการเป็นกลุ่มบนโหนดผู้ใช้ความคิดเห็น มันยังอนุญาตให้นำไปใช้ดำเนินการที่เลือกไปยังทุกโหนดผู้ใช้หรือแสดงความคิดเห็นโดยใช้API ชุด แบทช์ API ช่วยให้การประมวลผลแบบฟอร์มสามารถแพร่กระจายไปยังคำขอหน้าต่างๆได้จึงมั่นใจได้ว่าการประมวลผลจะไม่ถูกขัดจังหวะเนื่องจากการหมดเวลาของ PHP ในขณะที่ให้ผู้ใช้สามารถรับข้อเสนอแนะเกี่ยวกับความคืบหน้าของการดำเนินการต่อเนื่อง


1
การเลือกรายการทั้งหมดที่จะลบคือช้าอีกครั้งอย่างเจ็บปวด - มีการตั้งค่าในตัวเลือก VBO ของ View เพื่อเปิดใช้งานselect allปุ่มที่เลือกรายการทั้งหมดในทุกหน้า - คลิกที่รายการนั้นและKill-em-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");
}

สำหรับผู้ใช้คุณสามารถกำหนดผู้ใช้ที่คุณต้องการลบโดยทางโปรแกรมหรือไม่ หากเป็นไปได้คุณสามารถใช้ฟังก์ชันก่อนหน้าเป็นตัวอย่างเพื่อลบผู้ใช้ที่ไม่ได้ใช้งาน


3
ฉันขอแนะนำให้ห่อด้วยชุด Batch API เพื่อป้องกันไม่ให้หมดเวลา
ถอดรหัส

ได้อย่างแน่นอน มันเป็นตัวอย่างง่ายๆ
dobeerman

3

แทนการสร้างโมดูลที่กำหนดเองสำหรับงานนี้คุณสามารถใช้สคริปต์ง่ายและดำเนินการกับDrush เนื่องจากคุณต้องการประมวลผลผู้ใช้และโหนดจำนวนมากแนะนำให้ใช้ Batch 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. อัพเดตพา ธ drupal และชื่อไซต์เป็นคำสั่ง 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.
David L

1

ลอง 2 โมดูลเหล่านี้สำหรับ D6:

พรุนผู้ใช้ https://drupal.org/project/user_prune และผู้ใช้ลบ https://drupal.org/project/user_delete

การตัดพรุนของผู้ใช้ช่วยให้คุณสามารถลบผู้ใช้ที่ไม่ได้ใช้งานตามเกณฑ์ที่คุณระบุ

ลบผู้ใช้ช่วยให้คุณสามารถลบผู้ใช้และลบเนื้อหาที่ส่งทั้งหมดรวมถึงโหนดและความคิดเห็น


1

ฉันได้นำโมดูลที่กำหนดเองไปใช้เพื่อลบผู้ใช้ทั้งหมด indrupal 7 ในส่วนผู้ดูแลระบบ / บุคคลมีแบบฟอร์มใหม่สำหรับการดำเนินการนี้ให้เสร็จสมบูรณ์

เช่นกันด้วยการดื่มเหล้า

เป็นโครงการ sandbox Thk

เชื่อมโยงไปยังโครงการ


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 ล่าสุดและมันไม่ได้ทิ้งข้อมูลไว้ในช่องผู้ใช้ ฉันไม่เข้าใจความหมายของคำว่า "ก้อย"
Chris Burgess

1
ฉันเห็นคำตอบนี้ซ้ำคำที่คล้ายกันซึ่งห่อด้วย Python ด้านบน
Chris Burgess

1
ฉันกลับการโหวตของฉันสำหรับคำตอบนี้เพราะมันใช้งานได้จริงตามที่ต้องการ แนะนำ @niksmac เปลี่ยนการลงคะแนนเพื่อลงคะแนน โปรดทราบว่าไม่ใช่คำตอบ SQL เท่านั้นและใช้ drush
คริสเตียน

0

โมดูลลบทั้งหมดอาจมีประโยชน์

เมื่อติดตั้งแล้วคุณสามารถทำได้เช่น:

drush delete-all articles

หรือ

drush delete-all users

Drupal 6 เวอร์ชั่นใน dev แต่มาจากโน้ต:

ทุกอย่างจะทำงานได้ยกเว้นการลบอย่างรวดเร็ว


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.