1600 उपयोगकर्ता और 2500 पोस्ट कैसे हटाएं?


10

कुछ साल पहले मैंने Drupal 6.9 के साथ एक साइट को कॉन्फ़िगर किया था, और फिर मैं इसके बारे में भूल गया। मेरे पास उपयोगकर्ताओं के 160 पृष्ठ हैं जो सभी स्पैमर्स हैं और मुझे सभी को हटाने की आवश्यकता है। 3. MySQL कॉल (मुझे लगता है) के कारण एक बार में इस एक पृष्ठ को करना धीमा है। मेरे पास हटाने के लिए लगभग 2500 फोरम पोस्ट भी हैं।

मैं सीधे डेटाबेस से रिकॉर्ड को हटाने से थोड़ा डरता हूं।

मैंने "मास डिलीट" नामक एक मॉड्यूल देखा, लेकिन यह Drupal संस्करण 5 के लिए है और संस्करण 6 के लिए उपलब्ध नहीं है।

जवाबों:


17

आप व्यू बल्क ऑपरेशंस का उपयोग कर सकते हैं , एक मॉड्यूल जो नोड्स, उपयोगकर्ताओं, टिप्पणियों पर बल्क संचालन को निष्पादित करने की अनुमति देता है; यह बैच एपीआई का उपयोग करके सभी नोड्स, उपयोगकर्ताओं या टिप्पणियों के लिए चयनित ऑपरेशन को लागू करने की भी अनुमति देता है । बैच एपीआई फॉर्म प्रसंस्करण को कई पेज अनुरोधों पर फैलाने की अनुमति देता है, इस प्रकार यह सुनिश्चित करता है कि PHP टाइमआउट के कारण प्रसंस्करण बाधित नहीं होता है, जबकि उपयोगकर्ता चल रहे संचालन की प्रगति पर प्रतिक्रिया प्राप्त करने की अनुमति देता है।


1
हटाने के लिए सभी आइटमों का चयन करना, फिर से, दर्दनाक रूप से धीमा है - एक select allबटन को सक्षम करने के लिए व्यू के VBO विकल्पों में एक सेटिंग है जो सभी पृष्ठों में सभी आइटम का चयन करता है - इसे क्लिक करें और किल-एम-ऑल!
आयुष

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
मैं सुझाव दूंगा कि बैच एपीआई के साथ इसे टाइमिंग से रोकने के लिए।
Decipher

पक्का। इसका सरल उदाहरण है।
डोबर्मन

3

इस कार्य के लिए एक कस्टम मॉड्यूल बनाने के बजाय, आप एक सरल स्क्रिप्ट का उपयोग कर सकते हैं और इसे Drush के साथ निष्पादित कर सकते हैं । चूंकि आपको बहुत से उपयोगकर्ताओं और नोड्स को संसाधित करने की आवश्यकता है, बैच एपीआई के उपयोग की सिफारिश की जाती है (और इसका उपयोग ड्रश के साथ किया जा सकता है )।


2

यदि, मेरी तरह, आप पायथन दृष्टिकोण पसंद करते हैं (शायद यहाँ के आसपास दुर्लभ है, लेकिन अभी भी), यह इस समस्या को ठीक करने का एक पारदर्शी और प्रभावी तरीका है:

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. के साथ अपने DB में लॉग इन करें drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. SQL को अपनी स्वयं की स्थिति के साथ ऊपर चलाएं और परिणामों को उपयोगकर्ताओं के चर में पेस्ट करें।
  3. अपने ड्रुपल पथ और साइट का नाम ड्रश कमांड में अपडेट करें
  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

D6 के लिए ये 2 मॉड्यूल आज़माएं:

उपयोगकर्ता Prune https://drupal.org/project/user_prune और उपयोगकर्ता हटाएं https://drupal.org/project/user_delete

उपयोगकर्ता Prune आपको निर्दिष्ट मानदंडों के आधार पर निष्क्रिय उपयोगकर्ताओं को हटाने की सुविधा देता है।

उपयोगकर्ता हटाएं आपको एक उपयोगकर्ता को हटाने और नोड्स और टिप्पणियों सहित सभी प्रस्तुत सामग्री को हटाने की सुविधा देता है


1

मैंने सभी उपयोगकर्ताओं को हटाने के लिए एक कस्टम मॉड्यूल लागू किया है। 7. व्यवस्थापक / लोगों के क्षेत्र में इस ऑपरेशन को पूरा करने के लिए एक नया रूप है।

बहुत नशे के साथ।

एक सैंडबॉक्स प्रोजेक्ट है। 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 पर इसका परीक्षण किया, और इसने उपयोगकर्ता क्षेत्रों में डेटा नहीं छोड़ा। मुझे समझ में नहीं आता कि आप "पूंछ" से क्या मतलब है।
क्रिस बर्गेस

1
मैं देख रहा हूँ कि यह उत्तर ऊपर के पायथन में लिपटा हुआ समान है।
क्रिस बर्गेस

1
मैंने इस जवाब पर अपना वोट उलट दिया क्योंकि यह वास्तव में आवश्यकतानुसार काम करता है। वोट करने के लिए नीचे @niksmac परिवर्तन वोट की सिफारिश करें। ध्यान दें कि यह SQL केवल उत्तर नहीं है और ड्रश का उपयोग करता है।
ईसाई

0

मॉड्यूल डिलीट ऑल काम आ सकता है।

एक बार स्थापित होने के बाद आप उदाहरण के लिए कर सकते हैं:

drush delete-all articles

या

drush delete-all users

Drupal 6 संस्करण देव में लेकिन नोटों से:

त्वरित डिलीट को छोड़कर सब कुछ काम करना चाहिए।


0

मूल प्रश्न 6 के लिए है, लेकिन क्रिस बर्गेस के उत्तर का उपयोग करके ड्रुपल 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.