1600 kullanıcı ve 2500 yayın nasıl silinir?


10

Birkaç yıl önce Drupal 6.9 ile bir site yapılandırdım ve sonra unuttum. Tüm spam gönderen 160 kullanıcı var ve ben 3 hariç tüm silmek gerekir. MySQL çağrıları (sanırım) nedeniyle bir kerede bu bir sayfa yapmak acı yavaş. Ayrıca silmek için yaklaşık 2500 forum gönderisi var.

Kayıtları doğrudan veritabanından silmek için biraz korkuyorum.

"Toplu silme" adlı bir modül gördüm, ancak Drupal sürüm 5 için ve sürüm 6 için mevcut değil.

Yanıtlar:


17

Düğümlerde, kullanıcılarda, yorumlarda toplu işlemler yürütmeye izin veren bir modül olan Views Bulk Operations'ı kullanabilirsiniz ; seçilen işlemi Toplu İş API'sını kullanarak tüm düğümlere, kullanıcılara veya yorumlara uygulama izni verir . Toplu API, form işlemenin çeşitli sayfa istekleri üzerine yayılmasını sağlar, böylece bir PHP zaman aşımı nedeniyle işlemin kesintiye uğramamasını sağlarken, kullanıcının devam eden işlemlerin ilerlemesi hakkında geri bildirim almasına izin verir.


1
Silinecek tüm öğeleri seçmek yine acı verici bir şekilde yavaştır - Görünümün VBO seçeneklerinde, select alltüm sayfalardaki tüm öğeleri seçen bir düğmeyi etkinleştirmek için bir ayar vardır - tıklayın ve Hepsini öldür!
AyeshK

3

Düğümleri öldürmenin bu yolu çok yavaş, ama en güvenli

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

Kullanıcılar için, kaldırmak istediğiniz kullanıcıyı programlı olarak belirleyebilir misiniz? Mümkünse, değiştirilmemiş kullanıcıları kaldırmak için önceki işlevi kullanabilirsiniz.


3
Ben zaman aşımını önlemek için bir Toplu API toplu ile kaydırma öneririz.
Decipher

Kesinlikle. Basit bir örnek.
dobeerman


2

Benim gibi, bir Python yaklaşımını tercih ediyorsanız (muhtemelen burada nadirdir, ancak yine de), bu sorunu düzeltmenin şeffaf ve etkili bir yoludur:

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'

Adımlar temel olarak:

  1. İle DB'nize giriş yapın drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. Yukarıdaki SQL'i kendi konum koşulunuzla çalıştırın ve sonuçları users değişkenine yapıştırın.
  3. Drupal yolunuzu ve site adınızı drush komutuna güncelleyin
  4. Komut dosyasını ile çalıştır python delete-users.py

Eminim bunu yapmanın daha iyi bir yolu var, ama bu iyi işleyen saldırıya uğramış çözümüm.


1
Bunu tek astar olarak da yapabilirsiniz. for i in `drush sql-query 'SELECT list of usernames'`; do drush --yes user-cancel --delete-content $i; done.
David L


1

Tüm kullanıcıları indrupal 7 silmek için özel bir modül uyguladım. Admin / people alanında bu işlemi tamamlamak için yeni bir form var.

Çok sarhoş.

Bir sanal alan projesidir. Thk.

Proje bağlantısı.


1

Gelişmiş kullanıcı modülü kullanın . Bu modül, kullanıcı yönetimi sayfasına "gelişmiş" bir sekme ekler. Bu sekmede, kullanıcıları herhangi bir özelliğe (rol, durum vb.) Göre filtreleyebilir ve tümünü seçebilirsiniz. Kullanıcıları silme ve tüm içeriği kaldırma olarak kullanıcıların silme yöntemini seçerseniz, onlar tarafından oluşturulan tüm içeriği de silebilirsiniz.


0

Drush'a erişiminiz varsa ve kullanıcıların beyaz listeye eklemesini sağlayan ve ek modüller yüklemeyi içermeyen hızlı bir çözüm istiyorsanız:

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

Kopya yapıştırmadan önce yukarıdakileri @example.orgsaklamak için hem kullanıcı listesini hem de kullanıcı listesini ayarladığınızdan emin olun ('keepthisuser1', 'andthisuser2'):)


Bu, kullanıcı alanları ve diğerleri gibi kuyruklar bırakacaktır.
niksmac

1
Ne demek istediğinizin ayrıntılarını verebilir misiniz? Bunu en son Drupal 7'de test ettim ve kullanıcı alanlarında veri bırakmadı. "Kuyruklar" ile ne demek istediğini anlamıyorum.
Chris Burgess

1
Bu cevabın yukarıdaki Python'a sarılmış benzer bir cevabı tekrarladığını görüyorum.
Chris Burgess

1
Bu cevaba ilişkin oyumu geri aldım çünkü aslında gerektiği gibi çalışıyor. Yukarı oy vermek için @niksmac değişiklik oy aşağı öneririz. Sadece bir SQL yanıtı olmadığını ve drush kullandığını unutmayın.
Christian

0

Tümünü Sil modülü kullanışlı olabilir.

Kurulduktan sonra şunları yapabilirsiniz:

drush delete-all articles

veya

drush delete-all users

Dev'de Drupal 6 sürümü ancak notlardan:

Hızlı silme dışında her şey çalışıyor olmalıdır.


0

Orijinal soru 6 içindir, ancak Chris Burgess'in cevabını kullanmak Drupal 8'e böyle uygulanabilir;

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.