ลบโหนดหลังจาก X สัปดาห์มันถูกสร้างขึ้น


คำตอบ:


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();
  }
}

จะทำอย่างไรกับกฎใน drupal 8
RobinSon

1
นี่เป็นเจตนาที่แตกต่างจากผู้สร้างไซต์ / วิธีการตามกฎ ฉันขอให้ @UnsettlingTrend อัปเดตคำตอบของเขาตามนั้น ฉันยังไม่ได้ทดลองใช้กฎใน D8 ดังนั้นฉันจึงสามารถพูดคุยแก้ปัญหาตามโมดูลนั้นได้
Shawn Conn

7
การใช้ $ nodes = $ storage-> loadMultiple ($ nids) จากนั้น $ storage-> deleteMultiple ($ nodes) จะเร็วขึ้นเล็กน้อย แต่ถ้าคุณไม่ได้ลบหลายสิบโหนดไม่ใช่ปัญหาใหญ่
Berdir

@SiMoNe คุณยังไม่สามารถ ยังไม่มีโมดูลตัวกำหนดตารางกฎรวมทั้งกฎ 8 ยังไม่พร้อมใช้งาน
ไม่มี Sssweat

1
ฉันจะสร้างวิธีการตามคิวสำหรับการขยายออก คุณไม่ต้องการกฎ
เควิน

4

จากคำตอบของ Shawn Conn นี่คือวิธีแก้ปัญหาแบบเต็มสำหรับมือใหม่:

  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. ล้างแคชจากนั้นไปที่หน้าโมดูล - (yoursite.com/admin/modules) - และเปิดใช้งานโมดูลของคุณ (โดยค้นหา "ลบโหนดเก่า" คลิกช่องทำเครื่องหมายด้วยชื่อโมดูลและคลิกบันทึก)

  5. ทำ! เมื่อใดก็ตามที่คุณเรียกใช้ cron โหนด / หน้าเว็บที่เผยแพร่ใน 2 สัปดาห์หรือทุกอย่างที่คุณมีในตอนนี้จะถูกลบออก

  6. หมายเหตุ: หากต้องการกำหนดเวลาเมื่อ cron รันให้ไปที่ yoursite.com/admin/config/system/cron

การทดสอบ:

สร้างโหนดและเปลี่ยนวันที่เผยแพร่ตามปกติในแถบด้านข้างขวาเป็น -2 สัปดาห์หรืออะไรก็ตามที่คุณมี รัน cron ด้วยตนเองที่ yoursite.com/admin/config/system/cron และคุณไม่ควรค้นหาโหนดของคุณ


คุณไม่จำเป็นต้องปิด?> ที่จะทำให้เกิดข้อผิดพลาดในการตั้งค่าเซิร์ฟเวอร์บางอย่าง ฉันจะแนะนำให้มีการตั้งค่าที่มีโครงสร้างมากขึ้นโดยใช้ QueueAPI ด้วยวิธีนี้หากมีหลายพันหรือหลายร้อยโหนดที่จะลบมันจะไม่วางสายระบบภายใน cron op ด้านบน sitepoint.com/…
เควิน

ฮะ. เมื่อฉันไม่มี?> รหัสจะไม่ทำงานสำหรับฉัน
Chris Happy

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)หลีกเลี่ยงการสอบถามเอนทิตีที่ส่งกลับเฉพาะโหนดที่ผู้ใช้ที่ไม่ระบุชื่อมีการเข้าถึง (งาน 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);
  }
}

ฉันรู้ว่าคำถามนี้เก่า แต่ @kiamlaluno คำตอบของคุณช่วยประหยัดเวลาของฉัน! และแทนที่จะโพสต์คำถามใหม่ซึ่งจะซ้ำกับคำถามนี้คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับวิธี จำกัด การลบโหนดไปยังโหนดประเภทได้ articleไหมขอบคุณ
Elie Masaad

hook_cron()การนำไปใช้ครั้งล่าสุดที่แสดงนั้นได้กระทำไปแล้วrange()ซึ่งแตกต่างจากการนำไปใช้ก่อนหน้านี้
kiamlaluno

ดังrange()ที่ฉันเข้าใจจะ จำกัด จำนวนโหนดที่ลบในแต่ละครั้งที่งาน cron ทำงาน แต่บอกว่าฉันมีในเว็บไซต์ 30 โหนดประเภทpageและarticleวันที่สร้างมากกว่า 2 สัปดาห์ที่ผ่านมา ... วิธีการลบเฉพาะโหนดประเภทarticleโดยไม่ต้องลบโหนดประเภทpage? ... ขอโทษทักษะ php อันต่ำต้อยของฉัน แต่ฉันไม่เห็นการใช้งานดังกล่าวในโค้ดด้านบน! ขอบคุณ
Elie Masaad

0

ฉันจะลองทำเช่นนี้:

  1. สร้างมุมมองของโหนดทั้งหมดที่มีอายุ 2 สัปดาห์ขึ้นไป
  2. สร้างกฎของระบบเพื่อทำงานกับการบำรุงรักษา Cron
  3. ในการกำหนดค่ากฎสร้างการวนซ้ำเพื่อวนซ้ำผลลัพธ์การดูเหล่านั้น
  4. ลบแต่ละโหนด

ฉันจะพยายามทดสอบเมื่อฉันได้รับโอกาสเพราะฉันไม่แน่ใจว่าวิธีที่ง่าย / เป็นไปได้ที่จะใช้มุมมองเช่นนี้ใน 3 แต่นั่นเป็นสิ่งที่ฉันจะเริ่มต้นแน่นอน แน่นอนว่าสิ่งนี้มาพร้อมกับข้อแม้ที่จะไม่ลบโหนดเมื่ออายุ 2 สัปดาห์ขึ้นไป แต่จะขึ้นอยู่กับเมื่อ Cron ทำงานบนระบบของคุณ แต่ฉันคิดว่าภายใน 3 ชั่วโมงหรือมากกว่านั้นก็ยังเพียงพอ

(ฉันเพิ่งสังเกตเห็นว่าสิ่งนี้มีไว้สำหรับ D8 ฉันคิดว่ากระบวนการนี้ยังคงใช้งานได้)


ฉันไม่รู้ D8 จนกระทั่งหลังจากฉันพิมพ์มัน ฉันเพิ่งรู้ว่ากฎอยู่ในอัลฟาสำหรับเสถียรสำหรับ D8; ยังไม่ได้ลองเลย
UnsettlingTrend

ฉันไปกับกฏรุ่น dev สำหรับสิ่งที่ฉันพยายามดูเหมือนมั่นคง แต่ฉันติดอยู่กับความจริงที่ว่าดูเหมือนว่าจะไม่มีการวางแผนไว้เป็นอย่างอื่น - โมดูลกฎการดูเวอร์ชัน D8 เพื่อใช้ในการวนรอบผลการดู หากมีวิธีในการรับชมในกฎที่ฉันไม่สามารถคิดได้อาจเป็นไปได้ มิฉะนั้นฉันไม่แน่ใจ
UnsettlingTrend
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.