Jak mogę usunąć węzeł, na przykład po 2 tygodniach od jego utworzenia?
14
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:
Utwórz plik o nazwie „delete_old_nodes.module” i umieść w nim ten kod:
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.
źródło
Chciałbym również użyć
hook_cron()
implementacji, ale używając następującego kodu.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.
źródło
article
, dziękujęhook_cron()
pokazana implementacja już to robi, jak to wywołujerange()
, 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ówpage
iarticle
datę utworzenia ponad 2 tygodnie temu ... Jak usunąć tylko węzły typuarticle
bez usuwania węzła typupage
? ... Przepraszam za moje skromne umiejętności php, ale nie widziałem takiej implementacji w powyższym kodzie! DziękiSpró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).
źródło