ฉันจะลบโหนดหลังจากตัวอย่างเช่นมันถูกสร้างขึ้น 2 สัปดาห์ได้อย่างไร
ฉันจะลบโหนดหลังจากตัวอย่างเช่นมันถูกสร้างขึ้น 2 สัปดาห์ได้อย่างไร
คำตอบ:
หากคุณกำลังมองหาโซลูชันที่เน้นผู้พัฒนาเป็นหลักคุณสามารถเรียกใช้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();
}
}
จากคำตอบของ Shawn Conn นี่คือวิธีแก้ปัญหาแบบเต็มสำหรับมือใหม่:
สร้างไฟล์ในโฟลเดอร์ที่คุณเพิ่งสร้างชื่อ: "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();
}
}
?>
ล้างแคชจากนั้นไปที่หน้าโมดูล - (yoursite.com/admin/modules) - และเปิดใช้งานโมดูลของคุณ (โดยค้นหา "ลบโหนดเก่า" คลิกช่องทำเครื่องหมายด้วยชื่อโมดูลและคลิกบันทึก)
ทำ! เมื่อใดก็ตามที่คุณเรียกใช้ cron โหนด / หน้าเว็บที่เผยแพร่ใน 2 สัปดาห์หรือทุกอย่างที่คุณมีในตอนนี้จะถูกลบออก
หมายเหตุ: หากต้องการกำหนดเวลาเมื่อ cron รันให้ไปที่ yoursite.com/admin/config/system/cron
การทดสอบ:
สร้างโหนดและเปลี่ยนวันที่เผยแพร่ตามปกติในแถบด้านข้างขวาเป็น -2 สัปดาห์หรืออะไรก็ตามที่คุณมี รัน cron ด้วยตนเองที่ yoursite.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)
หลีกเลี่ยงการสอบถามเอนทิตีที่ส่งกลับเฉพาะโหนดที่ผู้ใช้ที่ไม่ระบุชื่อมีการเข้าถึง (งาน Cron ทำงานในฐานะผู้ใช้ที่ไม่ระบุชื่อ)
หากมีความเป็นไปได้ที่โหนดที่จะลบจะมากเกินไปฉันจะ จำกัด จำนวนของโหนดที่ถูกลบในแต่ละครั้งที่งาน cron ทำงาน
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()
ที่ฉันเข้าใจจะ จำกัด จำนวนโหนดที่ลบในแต่ละครั้งที่งาน cron ทำงาน แต่บอกว่าฉันมีในเว็บไซต์ 30 โหนดประเภทpage
และarticle
วันที่สร้างมากกว่า 2 สัปดาห์ที่ผ่านมา ... วิธีการลบเฉพาะโหนดประเภทarticle
โดยไม่ต้องลบโหนดประเภทpage
? ... ขอโทษทักษะ php อันต่ำต้อยของฉัน แต่ฉันไม่เห็นการใช้งานดังกล่าวในโค้ดด้านบน! ขอบคุณ
ฉันจะลองทำเช่นนี้:
ฉันจะพยายามทดสอบเมื่อฉันได้รับโอกาสเพราะฉันไม่แน่ใจว่าวิธีที่ง่าย / เป็นไปได้ที่จะใช้มุมมองเช่นนี้ใน 3 แต่นั่นเป็นสิ่งที่ฉันจะเริ่มต้นแน่นอน แน่นอนว่าสิ่งนี้มาพร้อมกับข้อแม้ที่จะไม่ลบโหนดเมื่ออายุ 2 สัปดาห์ขึ้นไป แต่จะขึ้นอยู่กับเมื่อ Cron ทำงานบนระบบของคุณ แต่ฉันคิดว่าภายใน 3 ชั่วโมงหรือมากกว่านั้นก็ยังเพียงพอ
(ฉันเพิ่งสังเกตเห็นว่าสิ่งนี้มีไว้สำหรับ D8 ฉันคิดว่ากระบวนการนี้ยังคงใช้งานได้)