Bagaimana cara menghapus 1600 pengguna dan 2500 posting?

10

Beberapa tahun yang lalu saya mengkonfigurasi sebuah situs dengan Drupal 6.9, dan kemudian saya melupakannya. Saya memiliki 160 halaman pengguna yang semuanya spammer dan saya perlu menghapus semua kecuali 3. Melakukan ini satu halaman pada satu waktu sangat lambat karena panggilan MySQL (saya kira). Saya juga punya sekitar 2.500 posting forum untuk dihapus.

Saya agak takut untuk menghapus catatan dari database secara langsung.

Saya melihat modul yang disebut "penghapusan massal", tetapi untuk Drupal versi 5 dan tidak tersedia untuk versi 6.

John R
sumber

Jawaban:

17

Anda dapat menggunakan Operasi Massal Views , modul yang memungkinkan untuk menjalankan operasi massal pada node, pengguna, komentar; itu juga memungkinkan untuk menerapkan operasi yang dipilih ke semua node, pengguna, atau komentar menggunakan API Batch . API batch memungkinkan pemrosesan formulir tersebar di beberapa permintaan halaman, sehingga memastikan bahwa pemrosesan tidak terganggu karena batas waktu PHP, sementara memungkinkan pengguna untuk menerima umpan balik tentang kemajuan operasi yang sedang berlangsung.

kiamlaluno
sumber
1
Memilih semua item untuk dihapus adalah, sekali lagi, sangat lambat - Ada pengaturan dalam opsi VBO View untuk mengaktifkan select alltombol yang memilih semua item di semua halaman - klik dan Kill-em-all!
AyeshK
3

Cara untuk membunuh node ini sangat lambat, tetapi paling aman

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

Untuk pengguna, dapatkah Anda secara terprogram menentukan pengguna yang ingin Anda hapus? Jika memungkinkan, Anda dapat menggunakan fungsi sebelumnya sebagai contoh untuk menghapus pengguna yang tidak dikunci.

dobeerman
sumber
3
Saya akan menyarankan membungkusnya dengan batch Batch API untuk mencegahnya kehabisan waktu.
Menguraikan
Tentunya. Ini contoh sederhana.
dobeerman
3

Alih-alih membuat modul khusus untuk tugas ini, Anda dapat menggunakan skrip sederhana dan menjalankannya dengan Drush . Karena Anda perlu memproses banyak pengguna dan node, disarankan menggunakan Batch API (dan dapat digunakan dengan Drush ).

Pierre Buyle
sumber
2

Jika, seperti saya, Anda lebih suka pendekatan Python (jarang di sini, tapi tetap saja), ini adalah cara yang transparan dan efektif untuk memperbaiki masalah ini:

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'

Langkah-langkahnya pada dasarnya:

  1. Masuk ke DB Anda dengan drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. Jalankan SQL di atas dengan kondisi Anda sendiri dan tempelkan hasilnya ke dalam variabel pengguna.
  3. Perbarui jalur drupal dan nama situs Anda menjadi perintah drushal
  4. Jalankan skrip dengan python delete-users.py

Saya yakin ada cara yang lebih baik untuk melakukan ini, tetapi ini adalah solusi yang diretas yang berfungsi dengan baik.

mlissner
sumber
1
Anda dapat melakukan ini sebagai satu-baris juga. for i in `drush sql-query 'SELECT list of usernames'`; do drush --yes user-cancel --delete-content $i; done.
David L
1

Saya telah mengimplementasikan modul khusus untuk menghapus semua pengguna indrupal 7. Di area admin / people ada formulir baru untuk menyelesaikan operasi ini.

Terlalu dengan mabuk.

Apakah proyek kotak pasir. Terima kasih

Tautan ke proyek.

lgrtm
sumber
1

Gunakan modul pengguna tingkat lanjut . Modul ini menambahkan tab "lanjutan" ke halaman manajemen pengguna. Di tab itu, Anda bisa memfilter pengguna berdasarkan atribut apa pun (peran, status, dll.) Dan pilih semua. Jika Anda memilih metode penghapusan pengguna sebagai menghapus pengguna dan menghapus semua konten, Anda juga dapat menghapus semua konten yang dibuat oleh mereka.

Sinan Erdem
sumber
0

Jika Anda memiliki akses ke Drush dan menginginkan solusi cepat yang memungkinkan Anda membuat daftar putih pengguna tetap dipertahankan dan tidak melibatkan pemasangan modul tambahan:

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

Pastikan untuk menyesuaikan kedua @example.orgdan daftar pengguna untuk tetap ('keepthisuser1', 'andthisuser2')di atas sebelum menyalin paste :)

Chris Burgess
sumber
Ini akan meninggalkan buntut, seperti bidang pengguna dan semua.
niksmac
1
Bisakah Anda memberikan perincian tentang apa yang Anda maksud? Saya baru saja menguji ini pada Drupal 7 terbaru, dan tidak meninggalkan data di bidang pengguna. Saya tidak mengerti apa yang Anda maksud dengan "ekor".
Chris Burgess
1
Saya melihat jawaban ini duplikat sama dengan dibungkus dengan Python di atas.
Chris Burgess
1
Saya membalikkan suara saya pada jawaban ini karena ternyata berfungsi seperti yang diminta. Rekomendasikan @niksmac ubah suara untuk memberi suara. Perhatikan bahwa ini bukan jawaban SQL saja dan menggunakan drush.
Kristen
0

Modul Hapus Semua bisa berguna.

Setelah terinstal, Anda dapat melakukannya, misalnya:

drush delete-all articles

atau

drush delete-all users

Versi Drupal 6 di dev tetapi dari catatan:

Semuanya harus berfungsi kecuali untuk menghapus cepat.

Mauro Sardu
sumber
0

Pertanyaan awal untuk 6, tetapi menggunakan jawaban Chris Burgess ' dapat diterapkan ke Drupal 8 seperti itu;

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
Kristen
sumber