Làm thế nào để xóa 1600 người dùng và 2500 bài viết?


10

Một vài năm trước tôi đã cấu hình một trang web với Drupal 6.9, và sau đó tôi quên nó. Tôi có 160 trang người dùng là tất cả những người gửi thư rác và tôi cần xóa tất cả trừ 3. Làm một trang này tại một thời điểm rất chậm do các cuộc gọi MySQL (tôi đoán). Tôi cũng có khoảng 2500 bài viết diễn đàn để xóa.

Tôi hơi ngại xóa hồ sơ từ cơ sở dữ liệu trực tiếp.

Tôi thấy một mô-đun gọi là "xóa hàng loạt", nhưng nó dành cho phiên bản Drupal 5 và không có sẵn cho phiên bản 6.

Câu trả lời:


17

Bạn có thể sử dụng Lượt xem hoạt động hàng loạt , một mô-đun cho phép thực hiện các hoạt động hàng loạt trên các nút, người dùng, nhận xét; nó cũng cho phép áp dụng thao tác đã chọn cho tất cả các nút, người dùng hoặc nhận xét bằng Batch API . API bó cho phép xử lý biểu mẫu trải rộng trên một số yêu cầu trang, do đó đảm bảo rằng quá trình xử lý không bị gián đoạn do hết thời gian PHP, đồng thời cho phép người dùng nhận phản hồi về tiến trình của các hoạt động đang diễn ra.


1
Chọn tất cả các mục để xóa là, một lần nữa, rất chậm - Có một cài đặt trong các tùy chọn VBO của View để bật select allnút chọn tất cả các mục trên tất cả các trang - nhấp vào đó và Kill-em-all!
AyeshK

3

Cách này để tiêu diệt các nút rất chậm, nhưng an toàn nhất

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

Đối với người dùng, bạn có thể lập trình xác định người dùng mà bạn muốn xóa không? Nếu có thể, bạn có thể sử dụng chức năng trước đó làm ví dụ để loại bỏ người dùng chưa được xử lý.


3
Tôi sẽ đề nghị gói nó với một lô Batch API để ngăn chặn nó hết thời gian.
Giải mã

Chắc chắn. Đó là một ví dụ đơn giản.
dobeerman


2

Nếu, giống như tôi, bạn thích một cách tiếp cận Python (hiếm khi ở đây có lẽ, nhưng vẫn vậy), đây là một cách minh bạch và hiệu quả để khắc phục vấn đề này:

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'

Các bước cơ bản là:

  1. Đăng nhập vào DB của bạn với drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. Chạy SQL ở trên với điều kiện của riêng bạn và dán kết quả vào biến người dùng.
  3. Cập nhật đường dẫn drupal và tên trang web của bạn vào lệnh drush
  4. Chạy kịch bản với python delete-users.py

Tôi chắc chắn có một cách tốt hơn để làm điều này, nhưng đây là giải pháp hack của tôi hoạt động tốt.


1
Bạn cũng có thể làm điều này như một lớp lót. for i in `drush sql-query 'SELECT list of usernames'`; do drush --yes user-cancel --delete-content $i; done.
David L


1

Tôi đã triển khai một mô-đun tùy chỉnh để xóa tất cả người dùng một cách gián đoạn 7. Trong khu vực quản trị / người có một hình thức mới để hoàn thành thao tác này.

Quá với drush.

Là một dự án hộp cát. Thk.

Liên kết với dự án.


1

Sử dụng mô-đun người dùng nâng cao . Mô-đun này thêm tab "nâng cao" vào trang quản lý người dùng. Trong tab đó, bạn có thể lọc người dùng theo bất kỳ thuộc tính nào (vai trò, trạng thái, v.v.) và chọn tất cả. Nếu bạn chọn phương thức xóa của người dùng là xóa người dùng và xóa tất cả nội dung, bạn cũng có thể xóa tất cả nội dung do họ tạo.


0

Các mô-đun Xóa Tất cả có thể có ích.

Sau khi cài đặt, bạn có thể làm, ví dụ:

drush delete-all articles

hoặc là

drush delete-all users

Phiên bản Drupal 6 trong dev nhưng từ ghi chú:

Tất cả mọi thứ nên được làm việc ngoại trừ để xóa nhanh chóng.


-1

Nếu bạn có quyền truy cập vào Drush và muốn một giải pháp nhanh chóng cho phép bạn giữ người dùng trong danh sách trắng và không liên quan đến việc cài đặt các mô-đun bổ sung:

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

Đảm bảo điều chỉnh cả @example.orgdanh sách và danh sách người dùng cần giữ ('keepthisuser1', 'andthisuser2')ở trên trước khi sao chép dán :)


Điều này sẽ để lại đuôi, như trường người dùng và tất cả.
niksmac

Bạn có thể cho biết chi tiết về những gì bạn có ý nghĩa? Tôi mới thử nghiệm điều này trên Drupal 7 mới nhất và nó không để lại dữ liệu trong các trường người dùng. Tôi không hiểu ý của bạn là "đuôi".
Chris Burgess

Tôi thấy câu trả lời này trùng lặp với một câu tương tự được gói trong Python ở trên.
Chris Burgess
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.