जवाबों:
यदि आप एक डेवलपर-केंद्रित समाधान की तलाश कर रहे हैं, तो आप 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();
}
}
शॉन कॉन के जवाब के आधार पर, यहाँ नौसिखियों के लिए पूर्ण समाधान है:
आपके द्वारा अभी बनाए गए फ़ोल्डर में एक फ़ाइल बनाएं: "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
"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();
}
}
?>
कैश फ्लश करें, फिर मॉड्यूल पृष्ठ पर नेविगेट करें - (आपकाiteite.com/admin/modules) - और अपने मॉड्यूल को सक्षम करें, ("पुराने नोड्स हटाएं" की खोज करके, मॉड्यूल नाम से चेकबॉक्स पर क्लिक करें और सहेजें पर क्लिक करें)।
किया हुआ! जब भी आप क्रोन चलाते हैं, तो नोड्स / पृष्ठ जो -2 सप्ताह प्रकाशित किए गए थे, या आपके पास जो कुछ भी है, वह अब से हटा दिया जाएगा।
नोट: जब क्रोन चलता है, तो शेड्यूल करने के लिए yourite.com/admin/config/system/cron पर जाएं
परिक्षण:
एक नोड बनाएं और प्रकाशित तिथि को बदल दें, आम तौर पर दाईं साइडबार में -2 सप्ताह या आपके पास जो कुछ भी है। Yourite.com/admin/config/system/cron पर मैन्युअल रूप से क्रोन चलाएं और आपको अपना नोड खोजने में सक्षम नहीं होना चाहिए।
मैं एक 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);
}
}
article
, धन्यवाद
hook_cron()
कार्यान्वयन पहले से ही दिखाया गया है, जैसा कि यह कहता है range()
, पिछले कार्यान्वयन से अलग है।
range()
के रूप में मैं समझता हूँ, सीमित कर देगा नोड्स की संख्या हर बार क्रॉन कार्य चलाने के नष्ट कर दिया। लेकिन कहते हैं कि मेरे पास साइट पर 30 प्रकार के नोड्स हैं page
और article
2 सप्ताह से अधिक पहले की निर्माण तिथि ... प्रकार article
के नोड को हटाने के बिना केवल प्रकार के नोड्स को कैसे हटाएं page
? ... मेरे विनम्र php कौशल का उपयोग करें, लेकिन मैं उपरोक्त कोड में ऐसा कार्यान्वयन नहीं देख सकता था! धन्यवाद
मैं इसे इस तरह से करने की कोशिश करूंगा:
जब मुझे मौका मिलेगा, मैं इसका परीक्षण करने की कोशिश करूंगा, क्योंकि मुझे इस तरह से देखने में उपयोग करने में कितना आसान / संभव होगा, यह मुझे यकीन नहीं है। बेशक, यह कैविटी के साथ आता है कि यह नोड्स को नहीं हटाएगा जब वास्तव में 2 सप्ताह का हो जाएगा, लेकिन यह निर्भर करेगा कि क्रोन आपके सिस्टम पर कब चलता है; लेकिन, मैं 3 घंटे के भीतर मान लेता हूं या अभी भी पर्याप्त है।
(मैं केवल ध्यान दिया यह D8 के लिए था; मुझे लगता है कि प्रक्रिया अभी भी ध्वनि है।)