Ответы:
Если вы ищете решение, ориентированное на разработчика, вы можете вызвать 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, узлы / страницы, которые были опубликованы через 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; я думаю, что процесс все еще звучит.)