Câu trả lời:
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();
}
}
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:
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
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();
}
}
?>
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).
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.
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.
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);
}
}
article
, Cảm ơn bạn
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 đó.
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 page
và article
vớ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 article
mà 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
Tôi sẽ cố gắng làm điều đó như sau:
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.)