एक्स हफ्तों के बाद एक नोड को हटा दिया गया था


14

मैं एक नोड को कैसे हटा सकता हूं, उदाहरण के लिए, 2 सप्ताह बाद इसे बनाया गया है?

जवाबों:


18

यदि आप एक डेवलपर-केंद्रित समाधान की तलाश कर रहे हैं, तो आप hook_cron()पुराने नोड्स को साफ करने के लिए एक कस्टम मॉड्यूल में आह्वान कर सकते हैं:

function MYMODULE_cron() {

  // Other conditions can be altered/added as neeed
  $query = \Drupal::entityQuery('node')
    ->condition('created', strtotime('-2 week'), '<=');
  $nids = $query->execute();
  foreach ($nids as $nid) {
    $node = node_load($nid);
    $node->delete();
  }
}

यह ड्रुपल 8 में नियमों के साथ कैसे कर सकता है?
रॉबिनसन

1
यह जानबूझकर साइट बिल्डर / नियम आधारित दृष्टिकोण से एक अलग दृष्टिकोण था। मैं उसके उत्तर को अपडेट करने के लिए @UnsettlingTrend के अनुसार पूछूंगा। मैंने D8 में अभी तक नियमों की कोशिश नहीं की है, इसलिए मैं उस मॉड्यूल के आधार पर समाधान के लिए बोल सकता हूं।
शॉन कॉन

7
$ नोड्स का उपयोग करना = $ संग्रहण-> लोडमूल्ट ($ nids) और फिर $ संग्रहण-> डिलीटमैल्ट ($ नोड्स) थोड़ा तेज है, लेकिन जब तक आप दर्जनों नोड्स नहीं हटा रहे हैं, तब तक कोई बड़ा मुद्दा नहीं है।
बेरदीर

@SiMoNe आप अभी तक नहीं कर सकते। कोई नियम शेड्यूलर मॉड्यूल अभी तक नहीं है, प्लस नियम 8 उत्पादन तैयार नहीं है।
नो एसस्वाइट

1
मैं स्केलिंग के लिए कतार आधारित दृष्टिकोण बनाऊंगा। आपको नियम की आवश्यकता नहीं है।
केविन

4

शॉन कॉन के जवाब के आधार पर, यहाँ नौसिखियों के लिए पूर्ण समाधान है:

  1. अपनी रूट फ़ाइल निर्देशिका पर जाएं और फ़ोल्डर "delete_old_nodes" बनाएं
  2. आपके द्वारा अभी बनाए गए फ़ोल्डर में एक फ़ाइल बनाएं: "delete_old_nodes.info.yml" और इस कोड को इसमें पेस्ट करें:

    name: Delete old nodes
    description: Deletes nodes older than 30 days.
    package: Custom
    type: module
    version: 1.0
    core: 8.x
  3. "Delete_old_nodes.module" नामक एक फ़ाइल बनाएं और इस कोड को इसमें डालें:

    <?php
    
    function delete_old_nodes_cron() {
    
      $query = \Drupal::entityQuery('node')
        ->condition('created', strtotime('-2 week'), '<='); // Can change -2 week to -2 year or -3 day
      $nids = $query->execute();
      foreach ($nids as $nid) {
        $node = node_load($nid);
        $node->delete();
      }
    }
    
    ?>
  4. कैश फ्लश करें, फिर मॉड्यूल पृष्ठ पर नेविगेट करें - (आपकाiteite.com/admin/modules) - और अपने मॉड्यूल को सक्षम करें, ("पुराने नोड्स हटाएं" की खोज करके, मॉड्यूल नाम से चेकबॉक्स पर क्लिक करें और सहेजें पर क्लिक करें)।

  5. किया हुआ! जब भी आप क्रोन चलाते हैं, तो नोड्स / पृष्ठ जो -2 सप्ताह प्रकाशित किए गए थे, या आपके पास जो कुछ भी है, वह अब से हटा दिया जाएगा।

  6. नोट: जब क्रोन चलता है, तो शेड्यूल करने के लिए yourite.com/admin/config/system/cron पर जाएं

परिक्षण:

एक नोड बनाएं और प्रकाशित तिथि को बदल दें, आम तौर पर दाईं साइडबार में -2 सप्ताह या आपके पास जो कुछ भी है। Yourite.com/admin/config/system/cron पर मैन्युअल रूप से क्रोन चलाएं और आपको अपना नोड खोजने में सक्षम नहीं होना चाहिए।


आपको समापन की आवश्यकता नहीं है?> जो कुछ सर्वर सेटअप पर त्रुटियों का कारण होगा। मैं क्यूयूएपीआईआई का उपयोग करके एक अधिक संरचित सेटअप होने की सलाह दूंगा, इस तरह से यदि हटाने के लिए हजारों या यहां तक ​​कि सैकड़ों नोड हैं, तो यह ऊपर क्रॉन ऑप के भीतर सिस्टम को लटकाएगा नहीं। sitepoint.com/…
केविन

हुह। जब मेरे पास नहीं था!>, कोड मेरे लिए काम नहीं करेगा।
क्रिस हैप्पी

2

मैं एक hook_cron()कार्यान्वयन का भी उपयोग करूंगा , लेकिन निम्नलिखित कोड का उपयोग करके।

function mymodule_cron() {
  $storage_handler = \Drupal::entityTypeManager()
    ->getStorage('node');
  $query = \Drupal::entityQuery('node')
    ->accessCheck(FALSE)
    ->condition('created', strtotime('-2 week'), '<=');
  $result = $query->execute();
  if (!empty($result)) {
    $nids = array_keys($result);
    $nodes = $storage_handler->loadMultiple($nids);
    $storage_handler->delete($nodes);
  }
}

नोड्स को हटाने के लिए मैंने जिस कोड का उपयोग किया था वह वह है जिसके लिए पदावनत संदेश entity_delete_multiple() उपयोग करने के ।
मैंने accessCheck(FALSE)उस इकाई से बचने के लिए एक कॉल का उपयोग किया जिसमें क्वेरी केवल उन नोड्स को लौटाती है जिन तक अनाम उपयोगकर्ता की पहुंच है। (क्रोन कार्य अनाम उपयोगकर्ता के रूप में चलते हैं।)

यदि तब संभावना है कि हटाने के लिए नोड्स बहुत अधिक हैं, तो मैं प्रत्येक बार क्रोन कार्यों को चलाने के लिए हटाए गए नोड्स की संख्या को सीमित कर दूंगा।

function mymodule_cron() {
  $storage_handler = \Drupal::entityTypeManager()
    ->getStorage('node');
  $query = \Drupal::entityQuery('node')
    ->accessCheck(FALSE)
    ->condition('created', strtotime('-2 week'), '<=')
    ->range(0,30);
  $result = $query->execute();
  if (!empty($result)) {
    $nids = array_keys($result);
    $nodes = $storage_handler->loadMultiple($nids);
    $storage_handler->delete($nodes);
  }
}

मुझे पता है कि यह प्रश्न पुराना है लेकिन @kiamlaluno ने आपके उत्तर से मेरा समय बचा लिया! और एक नए प्रश्न को पोस्ट करने के बजाय, जो इस एक का डुप्लिकेट होगा, क्या आप नोड्स के विलोपन को सीमित करने के तरीके पर अधिक विस्तार से बता सकते हैं article , धन्यवाद
Elie Masaad

अंतिम hook_cron()कार्यान्वयन पहले से ही दिखाया गया है, जैसा कि यह कहता है range(), पिछले कार्यान्वयन से अलग है।
kiamlaluno

range()के रूप में मैं समझता हूँ, सीमित कर देगा नोड्स की संख्या हर बार क्रॉन कार्य चलाने के नष्ट कर दिया। लेकिन कहते हैं कि मेरे पास साइट पर 30 प्रकार के नोड्स हैं pageऔर article2 सप्ताह से अधिक पहले की निर्माण तिथि ... प्रकार articleके नोड को हटाने के बिना केवल प्रकार के नोड्स को कैसे हटाएं page? ... मेरे विनम्र php कौशल का उपयोग करें, लेकिन मैं उपरोक्त कोड में ऐसा कार्यान्वयन नहीं देख सकता था! धन्यवाद
एली Masaad

0

मैं इसे इस तरह से करने की कोशिश करूंगा:

  1. सभी नोड्स का एक दृश्य बनाएं जो 2+ सप्ताह पुराना हो
  2. क्रोन रखरखाव पर चलाने के लिए एक प्रणाली नियम बनाएं
  3. नियम कॉन्फ़िगरेशन में, उन दृश्य परिणामों पर पुनरावृति करने के लिए एक लूप बनाएं
  4. प्रत्येक नोड को हटा दें

जब मुझे मौका मिलेगा, मैं इसका परीक्षण करने की कोशिश करूंगा, क्योंकि मुझे इस तरह से देखने में उपयोग करने में कितना आसान / संभव होगा, यह मुझे यकीन नहीं है। बेशक, यह कैविटी के साथ आता है कि यह नोड्स को नहीं हटाएगा जब वास्तव में 2 सप्ताह का हो जाएगा, लेकिन यह निर्भर करेगा कि क्रोन आपके सिस्टम पर कब चलता है; लेकिन, मैं 3 घंटे के भीतर मान लेता हूं या अभी भी पर्याप्त है।

(मैं केवल ध्यान दिया यह D8 के लिए था; मुझे लगता है कि प्रक्रिया अभी भी ध्वनि है।)


टाइप करने के बाद मुझे D8 का एहसास नहीं हुआ। मुझे पता है कि डी 8 के लिए स्थिर के लिए नियम अल्फा में हैं; अभी तक यह कोशिश नहीं की है।
UnsettlingTrend 16

मैं नियमों के देव संस्करण के साथ गया था। जो मैं कोशिश कर रहा था, उसके लिए यह स्थिर लग रहा था, लेकिन मैं इस तथ्य पर अटका हुआ हूं कि दृश्य परिणामों पर लूप का उपयोग करने के लिए व्यू रूल्स मॉड्यूल के डी -8 संस्करण को अन्यथा नियोजित नहीं किया गया है। यदि किसी दृश्य में दृश्य प्राप्त करने का कोई तरीका है जिसे मैं सोच भी नहीं सकता, तो यह काम कर सकता है। अन्यथा, मुझे यकीन नहीं है।
UnsettlingTrend 16
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.