Odpowiedzi:
Jeśli szukasz rozwiązania zorientowanego na programistę, możesz wywołać hook_cron()w niestandardowym module, aby wyczyścić stare węzły:
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();
}
}
Na podstawie odpowiedzi Shawna Conna, oto pełne rozwiązanie dla nowicjuszy:
Utwórz plik w właśnie utworzonym folderze o nazwie: „delete_old_nodes.info.yml” i wklej w nim ten kod:
name: Delete old nodes
description: Deletes nodes older than 30 days.
package: Custom
type: module
version: 1.0
core: 8.x
Utwórz plik o nazwie „delete_old_nodes.module” i umieść w nim ten kod:
<?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();
}
}
?>
Opróżnij pamięć podręczną, a następnie przejdź do strony modułów - (yoursite.com/admin/modules) - i włącz moduł (wyszukując „usuń stare węzły”, kliknij pole wyboru obok nazwy modułów i kliknij przycisk Zapisz).
Gotowy! Za każdym razem, gdy uruchomisz crona, węzły / strony, które zostały opublikowane -2 tygodnie lub cokolwiek masz, od teraz zostaną usunięte.
Uwaga: Aby zaplanować uruchomienie crona, przejdź do yoursite.com/admin/config/system/cron
Testowanie:
Utwórz węzeł i zmień datę publikacji, zwykle na prawym pasku bocznym, na -2 tygodnie lub cokolwiek masz. Ręcznie uruchom crona na yoursite.com/admin/config/system/cron, a znalezienie twojego węzła nie powinno być możliwe.
Chciałbym również użyć hook_cron()implementacji, ale używając następującego kodu.
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);
}
}
Kod, którego użyłem do usunięcia węzłów, to ten, który entity_delete_multiple()sugeruje użycie komunikatu o wycofaniu .
Użyłem również wywołania, aby accessCheck(FALSE)uniknąć zapytania o jednostkę zwracającego tylko te węzły, do których użytkownik anonimowy ma dostęp. (Zadania Crona są uruchamiane jako anonimowy użytkownik).
Jeśli zatem istnieje możliwość, że węzły do usunięcia są zbyt duże, ograniczę liczbę węzłów usuwanych przy każdym uruchomieniu zadań crona.
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 , dziękuję
hook_cron()pokazana implementacja już to robi, jak to wywołuje range(), inaczej niż poprzednia.
range()Jak rozumiem, ograniczy liczbę węzłów usunięte każdorazowo zadania cron uruchomić. Ale powiedz, że mam na stronie 30 węzłów typów pagei articledatę utworzenia ponad 2 tygodnie temu ... Jak usunąć tylko węzły typu articlebez usuwania węzła typu page? ... Przepraszam za moje skromne umiejętności php, ale nie widziałem takiej implementacji w powyższym kodzie! Dzięki
Spróbowałbym to zrobić w ten sposób:
Spróbuję go przetestować, kiedy będę miał szansę, ponieważ nie jestem do końca pewien, jak łatwe / możliwe będzie wykorzystanie takiego widoku w 3., ale na pewno od tego bym zaczął. Oczywiście wiąże się to z zastrzeżeniem, że nie usunie węzłów, gdy osiągną DOKŁADNIE 2 tygodnie, ale będzie zależało od tego, kiedy Cron uruchomi się w twoim systemie; ale zakładam, że w ciągu około 3 godzin nadal to wystarcza.
(Dopiero co zauważyłem, że dotyczy to D8; myślę jednak, że proces ten jest nadal dobry).