Antworten:
Wenn Sie eine entwicklerorientierte Lösung suchen, können Sie hook_cron()
in einem benutzerdefinierten Modul alte Knoten bereinigen:
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();
}
}
Basierend auf Shawn Conns Antwort ist hier die vollständige Lösung für Anfänger:
Erstellen Sie eine Datei in dem soeben erstellten Ordner "delete_old_nodes.info.yml" und fügen Sie diesen Code ein:
name: Delete old nodes
description: Deletes nodes older than 30 days.
package: Custom
type: module
version: 1.0
core: 8.x
Erstellen Sie eine Datei mit dem Namen "delete_old_nodes.module" und fügen Sie diesen Code ein:
<?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();
}
}
?>
Cache leeren, dann zur Modulseite (yoursite.com/admin/modules) navigieren und das Modul aktivieren (indem Sie nach "Alte Knoten löschen" suchen, auf das Kontrollkästchen neben dem Modulnamen klicken und auf Speichern klicken).
Erledigt! Wann immer Sie cron ausführen, werden die Knoten / Seiten, die in -2 Wochen veröffentlicht wurden oder auf denen Sie sie haben, von nun an gelöscht.
Hinweis: Um zu planen, wann cron ausgeführt wird, rufen Sie yoursite.com/admin/config/system/cron auf
Testen:
Erstellen Sie einen Knoten und ändern Sie das Veröffentlichungsdatum, normalerweise in der rechten Seitenleiste, auf -2 Wochen oder wie auch immer. Führen Sie cron manuell unter yoursite.com/admin/config/system/cron aus, und Sie sollten Ihren Knoten nicht finden können.
Ich würde auch eine hook_cron()
Implementierung verwenden, aber den folgenden Code verwenden.
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);
}
}
Der Code, den ich zum Löschen der Knoten verwendet habe, ist der, für den die entity_delete_multiple()
Verfallsnachricht die Verwendung vorschlägt.
Ich habe auch einen Aufruf verwendet, um accessCheck(FALSE)
zu vermeiden, dass die Entitätsabfrage nur die Knoten zurückgibt, auf die der anonyme Benutzer Zugriff hat. (Cron-Tasks werden als anonymer Benutzer ausgeführt.)
Wenn dann die Möglichkeit besteht, dass die zu löschenden Knoten zu groß sind, würde ich die Anzahl der Knoten begrenzen, die jedes Mal gelöscht werden, wenn Cron-Tasks ausgeführt werden.
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
kann. Vielen Dank
hook_cron()
gezeigte Implementierung unterscheidet sich bereits range()
von der vorherigen Implementierung.
range()
wie ich es verstehe, wird die Anzahl der Knoten begrenzen jedes Mal Cron - Tasks ausführen gelöscht. Angenommen, ich habe auf der Site 30 Typknoten page
& article
mit Erstellungsdatum vor mehr als 2 Wochen ... Wie löschearticle
page
ich nur die Typknoten, ohne den Typknoten zu löschen ? ... Entschuldigen Sie meine bescheidenen PHP-Fähigkeiten, aber ich konnte eine solche Implementierung im obigen Code nicht sehen! Vielen Dank
Ich würde versuchen, es als solches zu tun:
Ich werde versuchen, es zu testen, wenn ich die Gelegenheit dazu bekomme, da ich nicht ganz sicher bin, wie einfach / möglich es sein wird, die Ansicht in 3. so zu nutzen, aber das ist definitiv der Punkt, an dem ich anfangen würde. Dies ist natürlich mit dem Vorbehalt verbunden, dass Knoten nicht gelöscht werden, wenn sie GENAU 2 Wochen alt sind, sondern davon abhängen, wann Cron auf Ihrem System ausgeführt wird. aber ich nehme an, innerhalb von 3 stunden reicht das noch aus.
(Ich habe gerade erst gemerkt, dass dies für D8 war; ich denke, der Prozess ist immer noch gut.)