Відповіді:
Якщо ви шукаєте рішення, орієнтоване на розробників, ви можете 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();
}
}
?>
Очистіть кеш, потім перейдіть на сторінку модулів - (yoursite.com/admin/modules) - і ввімкніть свій модуль, (шукаючи "видалити старі вузли", поставте прапорець за назвою модулів і натисніть кнопку "Зберегти").
Готово! Щоразу, коли ви запускаєте cron, вузли / сторінки, які були опубліковані за два тижні, або все, що у вас є, відтепер буде видалено.
Примітка. Щоб запланувати час запуску Cron, перейдіть на сайт yourite.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; я думаю, що процес все ще звучить.)