Xóa một nút sau X tuần nó được tạo


15

Làm thế nào tôi có thể xóa một nút sau, ví dụ, 2 tuần nó đã được tạo?

Câu trả lời:


18

Nếu bạn đang tìm kiếm một giải pháp tập trung vào nhà phát triển, bạn có thể gọi hook_cron()một mô-đun tùy chỉnh để dọn sạch các nút cũ:

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

Làm thế nào có thể làm điều đó với các quy tắc trong drupal 8?
RobinSon

1
Đây là một cách tiếp cận khác với cách tiếp cận dựa trên quy tắc / xây dựng trang web. Tôi yêu cầu @UnsettlingTrend cập nhật câu trả lời của anh ấy cho phù hợp. Tôi chưa thử Quy tắc trong D8, vì vậy tôi có thể nói về giải pháp dựa trên mô-đun đó.
Shawn Conn

7
Sử dụng $ nút = $ Storage-> loadMult Môn ($ nids) và sau đó $ Storage-> xóaMult Môn (nút $) nhanh hơn một chút, nhưng trừ khi bạn xóa hàng tá nút, không phải là vấn đề lớn.
Berdir

@SiMoNe bạn chưa thể. Không có mô-đun lập lịch quy tắc nào, cộng với Quy tắc 8 chưa sẵn sàng sản xuất.
Không có Sssweat

1
Tôi sẽ tạo ra một cách tiếp cận dựa trên hàng đợi để nhân rộng. Bạn không cần Quy tắc.
Kevin

4

Dựa trên câu trả lời của Shawn Conn, đây là giải pháp đầy đủ cho người mới:

  1. Chuyển đến thư mục tệp gốc của bạn và tạo thư mục "xóa_old_nodes"
  2. Tạo một tệp trong thư mục bạn vừa tạo có tên: "xóa_old_nodes.info.yml" và dán mã này vào đó:

    name: Delete old nodes
    description: Deletes nodes older than 30 days.
    package: Custom
    type: module
    version: 1.0
    core: 8.x
  3. Tạo một tệp có tên "xóa_old_nodes.module" và đặt mã này vào đó:

    <?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. Xóa bộ đệm, sau đó điều hướng đến trang mô-đun - (yoursite.com/admin/modules) - và bật mô-đun của bạn, (bằng cách tìm kiếm "xóa các nút cũ", nhấp vào hộp kiểm theo tên mô-đun và nhấp vào lưu).

  5. Làm xong! Bất cứ khi nào bạn chạy cron, các nút / trang được xuất bản -2 tuần hoặc bất cứ thứ gì bạn có, từ giờ sẽ bị xóa.

  6. Lưu ý: Để lên lịch khi cron chạy, hãy truy cập yoursite.com/admin/config/system/cron

Kiểm tra:

Tạo một nút và thay đổi ngày xuất bản, thông thường ở thanh bên phải, thành -2 tuần hoặc bất cứ điều gì bạn có. Chạy cron thủ công tại yoursite.com/admin/config/system/cron và bạn không thể tìm thấy nút của mình.


Bạn không cần kết thúc?>. Điều đó sẽ gây ra lỗi trên một số thiết lập máy chủ. Tôi khuyên bạn nên thiết lập có cấu trúc chặt chẽ hơn bằng QueueAPI, theo cách đó nếu có hàng ngàn hoặc thậm chí hàng trăm nút để xóa, nó sẽ không treo hệ thống trong cron op ở trên. sitepoint.com/ Từ
Kevin

Huh. Khi tôi không có?>, Mã sẽ không hoạt động với tôi.
Chris Chúc mừng

2

Tôi cũng sẽ sử dụng một hook_cron()triển khai, nhưng sử dụng mã sau đây.

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

Mã tôi đã sử dụng để xóa các nút là mã mà thông báo không dùng nữa để entity_delete_multiple()gợi ý sử dụng.
Tôi cũng đã sử dụng một cuộc gọi đếnaccessCheck(FALSE) tránh truy vấn thực thể chỉ trả về các nút mà người dùng ẩn danh có quyền truy cập. (Tác vụ Cron chạy dưới dạng người dùng ẩn danh.)

Nếu sau đó có khả năng các nút cần xóa quá nhiều, tôi sẽ giới hạn số lượng nút bị xóa mỗi khi tác vụ cron chạy.

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

Tôi biết câu hỏi này đã cũ nhưng @kiamlaluno câu trả lời của bạn đã tiết kiệm thời gian của tôi! và thay vì đăng một câu hỏi mới sẽ là một bản sao của câu hỏi này, bạn có thể giải thích rõ hơn về cách hạn chế xóa các nút thành nút loại article , Cảm ơn bạn
Elie Masaad

Việc hook_cron()thực hiện cuối cùng được hiển thị đã làm điều đó, như nó gọi range(), khác với thực hiện trước đó.
kiamlaluno

Theo range()tôi hiểu, sẽ giới hạn số lượng nút bị xóa mỗi khi tác vụ cron chạy. Nhưng nói rằng tôi có trên trang web 30 nút loại pagearticlevới ngày tạo hơn 2 tuần trước ... Làm thế nào để chỉ xóa các nút loại articlemà không xóa nút loại page? ... Xin lỗi các kỹ năng php khiêm tốn của tôi nhưng tôi không thể thấy việc triển khai như vậy trong đoạn mã trên! Cảm ơn
Elie Masaad

0

Tôi sẽ cố gắng làm điều đó như sau:

  1. Tạo Chế độ xem của tất cả các nút đã hơn 2 tuần tuổi
  2. Tạo một quy tắc hệ thống để chạy trên bảo trì Cron
  3. Trong cấu hình quy tắc, tạo một vòng lặp để lặp lại các kết quả xem đó
  4. Xóa từng nút

Tôi sẽ thử kiểm tra nó khi tôi có cơ hội, bởi vì tôi không hoàn toàn chắc chắn việc sử dụng chế độ xem như thế nào trong 3., nhưng đó chắc chắn là nơi tôi bắt đầu. Tất nhiên, điều này đi kèm với lời cảnh báo rằng nó sẽ không xóa các nút khi trở nên CHÍNH XÁC 2 tuần tuổi, nhưng sẽ phụ thuộc vào khi Cron chạy trên hệ thống của bạn; nhưng, tôi giả sử trong vòng 3 giờ hoặc lâu hơn vẫn là đủ.

(Tôi chỉ nhận thấy điều này là dành cho D8; Tôi nghĩ rằng quá trình vẫn còn âm thanh.)


Tôi đã không nhận ra D8 cho đến khi tôi gõ nó. Tôi chỉ biết các quy tắc đang ở trạng thái ổn định cho D8; chưa thử.
Bất ổn Xu hướng

Tôi đã đi với phiên bản dev của Rules. Đối với những gì tôi đã thử, nó có vẻ ổn định, nhưng tôi bị mắc kẹt ở thực tế là dường như không có kế hoạch nào khác - phiên bản D8 của mô-đun Chế độ xem được sử dụng để lặp lại kết quả xem. Nếu có một cách để có được Lượt xem trong Quy tắc mà tôi không thể nghĩ ra, thì nó có thể hoạt động. Nếu không, tôi không chắc chắn.
Bất ổn Xu hướng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.