किसी दी गई सामग्री प्रकार के सभी नोड्स को कैसे हटाएं?


31

मेरे पास एक विशेष सामग्री प्रकार के कई हजार नोड हैं। वेब इंटरफ़ेस (example.com/admin/content) का उपयोग करके, मैं केवल एक बार में लगभग 50 हटा सकता हूं। मैं उन्हें कैसे हटा सकता हूं?

जवाबों:


32

उस (TM) के लिए एक मॉड्यूल है।

बल्क डिलीट देखें ।

नोड-डिलीट_मूल्टिटर () के लिए एक कॉल के साथ हजारों नोड्स को हटाने पर टाइमआउट या मेमोरी मुद्दों से बचने के लिए नोड्स को हटाने के लिए बैच एपीआई का उपयोग करेगा।

बल्क डिलीट एक परित्यक्त मॉड्यूल है। विकल्प के लिए देखें:


वाह, मैं पूरी तरह से इस एक को याद किया। अच्छा मिल गया।
ग्रेग

4
एक अन्य विधि, जो उपयोगी हो सकती है यदि आप एक साधारण सामग्री प्रकार के फिल्टर से अधिक काम कर रहे हैं, तो व्यू
बुल्के

बल्क डिलीट मॉड्यूल अब छोड़ दिया गया है। यह सुझाव दिया जाता है कि व्यू बुल्के ऑपरेशंस का उपयोग किया जाए।
रिफाइनो

26

प्रेरणा के लिए देवल जनरेट मॉड्यूल को देखते हुए, यहां इसका "कंटेंट किल" फंक्शन है devel_generate_content_kill:

function devel_generate_content_kill($values) {
  $results = db_select('node', 'n')
              ->fields('n', array('nid'))
              ->condition('type', $values['node_types'], 'IN')
              ->execute();
  foreach ($results as $result) {
    $nids[] = $result->nid;
  }

  if (!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(t('Deleted %count nodes.', array('%count' => count($nids))));
  }
}

इसलिए मैं सभी नोड्स को हटाने के लिए या तो Devel Generate का उपयोग करने की कोशिश करूंगा लेकिन कोई नया नहीं बनाऊंगा या devel_generate_content_kill(array('node_types' => array('my_node_type')));सीधे कॉल करने के लिए example.com/devel/php का उपयोग करूंगा ।


17

Drupal 8 में एक तरह से EntityStorageInterface :: हटाएं () विधि के साथ UnitQuery () विधि का उपयोग करें :

$result = \Drupal::entityQuery("node")
    ->condition("type", "YOUR_CONTENT_TYPE_NAME")
    // If the update is being executed via drush entityQuery will only
    // return the content uid 0 have access to. To return all set
    // accessCheck to false since it defaults to TRUE. 
    ->accessCheck(FALSE)
    ->execute();

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadMultiple($result);
$storage_handler->delete($entities);

यदि आपको अन्य फ़िल्टर / शर्तें लागू करने की आवश्यकता है तो आप QueryInterface इंटरफ़ेस पृष्ठ की जांच कर सकते हैं

EDIT (अन्य तरीका, @ 4k4 के लिए धन्यवाद):

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadByProperties(["type" => "YOUR_CONTENT_TYPE_NAME"]);
$storage_handler->delete($entities);

यदि आप उस कोड का परीक्षण करना चाहते हैं जिसका आप उपयोग कर सकते हैं:

drush php-eval '$storage_handler = \Drupal::entityTypeManager()->getStorage("node"); $entities = $storage_handler->loadByProperties(["type" => "article"]); $storage_handler->delete($entities);'

यह आपके सभी लेखों को हटा देगा।


यह सही नहीं है, हटाएं () भरी हुई संस्थाओं की अपेक्षा करता है, न कि आईडी की, जो कि इकाई क्वेरी रिटर्न है। गैर-वर्णनात्मक $ परिणाम के बजाय, $ id या $ nids का उपयोग करें और फिर $ संग्रहण-> हटाएं ($ संग्रहण-> लोड ($ ids))।
बेदिर

@ बर्डिर धन्यवाद, मैं फिर से कोड का परीक्षण करूंगा, शायद यह समस्या एक संपादन में पेश की गई थी
एड्रियन सीआईडी ​​अल्मागुएर

@ बर्डिर मैं उत्तर को अपडेट करता हूं और मैं कोड का परीक्षण करता हूं और यह काम करता है, समस्या को एक संपादन में पेश किया गया था।
एड्रियन सीआईडी ​​अल्मागुएर

2
@AdrianCidAlmaguer, आप के साथ क्वेरी की जगह सकता है$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
4k4

1
हाल ही में अपडेट हुक में इसका उपयोग किया गया है, यह ध्यान देने योग्य है कि यदि आप उपयोग करते entityQuery हैं तो आपको accessCheckबयान पर सेट करना चाहिए । अन्यथा यदि आप इसे ड्रश में चलाते हैं, तो डिफ़ॉल्ट रूप से एक्सेसचेक सही पर सेट होता है और किसी भी नोड जो uid 0 तक पहुंच नहीं है, वापस नहीं किया जाएगा।
AWM

13

यदि आप इसे विशुद्ध रूप से UI के माध्यम से करना चाहते हैं, तो आप devel_generate मॉड्यूल का उपयोग कर सकते हैं।

  1. "कॉन्फ़िगरेशन" (व्यवस्थापक / कॉन्फ़िगरेशन / विकास / उत्पन्न / सामग्री) में "सामग्री उत्पन्न करें" मेनू पर नेविगेट करें।
  2. उस सामग्री प्रकार का चयन करें जिसे आप हटाना चाहते हैं।
  3. "नई सामग्री बनाने से पहले इन सामग्री प्रकारों में सभी सामग्री हटाएं" के आगे चेकबॉक्स सुनिश्चित करें।
  4. उन नोड्स की संख्या निर्धारित करें जिन्हें आप "0" पर जनरेट करना चाहते हैं।

इस तरह, कोई नोड उत्पन्न नहीं होगी और चयनित प्रकार के सभी नोड हटा दिए जाएंगे।


10

ड्रुपल इंस्टॉलेशन की जड़ में नीचे कोड के साथ एक फ़ाइल बनाएं और फ़ाइल को निष्पादित करें।

<?php
  require_once './includes/bootstrap.inc';
  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

  $aquery= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'company'");
  while ($row = db_fetch_object($aquery)) {
    node_delete($row->nid);
  }
?>

1
db_fetch_object D7 डेटाबेस एपीआई का हिस्सा नहीं है।
ya.teck

10

आप ऐसा कर सकते हैं कि ड्रुपल 7 में डेवेल मॉड्यूल के एक्ज़ीक्यूट PHP कोड भाग का उपयोग करके दर्ज किया गया है:

$result= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'TYPE'");
foreach ($result as $record) {
  node_delete($record->nid);
}

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

6

टर्मिनल में ऐसा करें, यदि आप ड्रश और डिलीट ऑल मॉड्यूल का उपयोग करते हैं:

 drush delete-all [content-type-machine-name]


Examples:
 drush delete-all article             Delect all article nodes.
 drush delete-all all                 Delete nodes of all types.
 drush delete-all --reset             Delete nodes of all types, and reset node, revision and comment counters.
 drush delete-all users               Delete users.

Options:
 --reset                              Reset counter for node, revision and comment tables.
 --roles                              pick roles

5

दृश्य बल्क ऑपरेशन एक बैच सक्षम, कॉन्फ़िगर करने योग्य नोड व्यवस्थापक स्क्रीन प्रदान करता है जो प्रकार से फ़िल्टर करने, आपके खोज मानदंडों से मेल खाने वाले सभी नोड्स का चयन, आदि की अनुमति देता है।

ड्रुपल 6 में मेरा हाथ से नीचे का समाधान है - बैच डिलीट के अलावा, आप नोड्स को थोक-संपादित कर सकते हैं और अन्य सामान का एक गुच्छा बना सकते हैं।

ऐसा लगता है कि ड्रुपल 7 संस्करण अभी तैयार नहीं है - लेकिन मैं उस मॉड्यूल को डी 7 रिलीज के लिए देख रहा हूं।


4

एक और स्निपेट है:

$query = db_query("SELECT n.nid FROM {node} n WHERE n.type = 'TO_BE_DELETED'"); 
while ($n = db_fetch_object($query)) 
{
     node_delete($n->nid); 
} 

TO_BE_DELETEDसामग्री प्रकार कहां हटाया जाना है।


3
यह ध्यान दिया जाना चाहिए कि Drupal 4.6, 5 और 6 के लिए ही काम करता है। ड्रुपल 7 संस्करण हैdb_delete('node')
ग्रेग

4

देवल मॉड्यूल के साथ, ड्रश का उपयोग:

drush genc 0 --types=article --kill

या यूआई में यहां बताया गया है: http://befused.com/drupal/delete-nodes-devel


यह देवल उप-मॉड्यूल है devel_generateजिसे सक्षम करने की आवश्यकता है। और कई प्रकारों के लिए यह हैdrush genc 0 --kill --types="article, page"
leymannx

3

मैं सभी मॉड्यूल को हटाता हूं, यह D8 के साथ ठीक काम करता है और बहुत उपयोगी ड्रश कमांड प्रदान करता है। उदाहरण के लिए, articleसामग्री प्रकार की सभी सामग्री को हटाने के लिए :

drush delete-all article  

क्या यह D8 के साथ काम करता है? मैंने मॉड्यूल को सक्षम किया, लेकिन मुझे ड्रश कमांड 'डिलीट-ऑल आर्टिकल' नहीं मिला। मैंने ड्रश कैश को भी मंजूरी दे दी
यार्न तहतह

1

आप सभी मॉड्यूल को हटाने का प्रयास कर सकते हैं , 'व्यवस्थापक / सामग्री / delete_content' पर नेविगेट कर सकते हैं और आपको कुछ सामग्री प्रकारों से संबंधित सामग्री को हटाने के लिए फ़ॉर्म के साथ प्रस्तुत किया जाएगा।

सादर



0

इस मॉड्यूल का उपयोग किसी साइट से सभी सामग्री और / या उपयोगकर्ताओं को हटाने के लिए किया जाता है। यह मुख्य रूप से एक डेवलपर टूल है, जो कई मामलों में काम आ सकता है

https://www.drupal.org/project/delete_all

जैसा कि बल्क डिलीट मॉड्यूल बैच एपीआई का उपयोग करके एक निश्चित नोड-प्रकार के किसी भी नोड को हटा देगा। कम संख्या में नोड्स के लिए व्यू बैच ऑपरेशन मॉड्यूल (वीबीओ) का उपयोग करने की सलाह दी जाती है। लेकिन अगर आपको 10.000 नोड्स को हटाना है तो यह मॉड्यूल एक बेहतर विकल्प हो सकता है।

https://www.drupal.org/project/bulkdelete


0

प्रोग्राम प्रकार के सभी नोड्स को हटाएं यहां एक सहायक कार्य है:


function _delete_all_nodes_of_type($type = '') {
  // Return all nids of nodes of type.
  $nids = db_select('node', 'n')
    ->fields('n', array('nid'))
    ->condition('n.type', $type)
    ->execute()
    ->fetchCol(); // returns an indexed array
  if (!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(format_plural(count($nids), count($nids) . ' node Deleted.', count($nids) . ' nodes Deleted.'));
  }
}


-1

मैंने db_delete का उपयोग करते हुए समाप्त किया , किसी भी मॉड्यूल की आवश्यकता नहीं है:

<?php
  db_delete('node')
    ->condition('type', 'MY_CONTENT_TYPE')
    ->execute();
?>

संपादित करें / चेतावनी: नीचे बर्दिर की टिप्पणी देखें। यह विधि नोड्स से संबंधित सभी डेटा को साफ नहीं करती है।


3
इस दृष्टिकोण के साथ समस्या यह है कि अन्य मॉड्यूल प्रतिक्रिया करने में सक्षम नहीं हैं और उनकी जानकारी भी हटा सकते हैं। सामग्री प्रकार के आधार पर, उस नोड, फ़ील्ड, टैक्सोनॉमी (एक फ़ील्ड भी, वास्तव में), टिप्पणियों और इसी तरह की सामग्री तालिका में नोड विशिष्ट जानकारी होती है। तो आप संभवतः अपने डेटाबेस में बहुत सारी बासी जानकारी के साथ समाप्त होते हैं।
बेर्दिर

@ बरदीर - दिलचस्प। क्या नोड्स को हटाने का एक बेहतर अंतर्निहित तरीका है?
ग्रेग

3
नोड_डेलीट () और नोड_डेलेट_मूल्टिटर () है, टिम का जवाब देखिए। लेकिन यह हजारों नोड्स को संभालने के लिए डिज़ाइन नहीं किया गया है, देखें api.drupal.org/api/drupal/multules--node--node.module/function /… । यह सभी नोड्स को लोड करता है और फिर एक ही अनुरोध में उन पर पुनरावृत्त करता है। यदि आप सैकड़ों या हजारों नोड्स को हटाना चाहते हैं तो बहुत अधिक बल्कडेलीट जैसे कंट्रिब मॉड्यूल का उपयोग करना होगा।
बर्दिर

-1

यदि आप कॉड नहीं करना चाहते हैं, तो आप इस मॉड्यूल की कोशिश कर सकते हैं, https://drupal.org/project/total_control

बस डैशबोर्ड पर जाएं -> सामग्री, सभी सामग्री का चयन करें (आप सामग्री प्रकार द्वारा फ़िल्टर कर सकते हैं), फिर "आइटम हटाएं" चुनें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.