Как удалить узел, например, через 2 недели после его создания?
14
Если вы ищете решение, ориентированное на разработчика, вы можете вызвать 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" и вставьте в него этот код:
Создайте файл с именем «delete_old_nodes.module» и вставьте в него этот код:
Очистите кэш, затем перейдите на страницу модулей - (yoursite.com/admin/modules) - и включите ваш модуль (в поиске «удалить старые узлы» установите флажок по имени модуля и нажмите «Сохранить»).
Выполнено! Всякий раз, когда вы запускаете cron, узлы / страницы, которые были опубликованы через 2 недели, или что бы то ни было, будут удалены.
Примечание. Чтобы запланировать запуск cron, перейдите на yoursite.com/admin/config/system/cron.
Тестирование:
Создайте узел и измените опубликованную дату, обычно на правой боковой панели, на -2 недели или любую другую дату. Запустите cron вручную на yoursite.com/admin/config/system/cron, и вы не сможете найти свой узел.
источник
Я бы тоже использовал
hook_cron()
реализацию, но используя следующий код.Код, который я использовал для удаления узлов, - это код, для которого
entity_delete_multiple()
предлагается использовать сообщение об устаревании .Я также использовал вызов, чтобы
accessCheck(FALSE)
избежать запроса сущности, который возвращает только узлы, к которым имеет доступ анонимный пользователь. (Задачи Cron запускаются как анонимный пользователь.)Если есть вероятность, что удаляемые узлы слишком велики, я бы ограничил количество удаляемых узлов при каждом запуске задач cron.
источник
article
, спасибоhook_cron()
показанная реализация уже делает это, как это называетсяrange()
, иначе, чем предыдущая реализация.range()
я понимаю, будет ограничивать количество узлов, удаляемых при каждом запуске задач cron. Но скажем, у меня на сайте 30 узлов типовpage
иarticle
с датой создания более 2 недель назад ... Как удалить только узлы типаarticle
без удаления узла типаpage
? ... Извините за мои скромные навыки PHP, но я не мог видеть такую реализацию в приведенном выше коде! СпасибоЯ бы попробовал сделать это так:
Я попытаюсь проверить это, когда у меня будет шанс, потому что я не совсем уверен, насколько легко / возможно будет использовать такое представление в 3., но это определенно то, с чего я бы начал. Конечно, это связано с предупреждением о том, что он не будет удалять узлы, когда им станет ровно 2 недели, но будет зависеть от того, когда Cron будет работать в вашей системе; но я предполагаю, что в течение 3 часов или около того все еще достаточно.
(Я только что заметил, что это было для D8; я думаю, что процесс все еще звучит.)
источник