Risposte:
Se stai cercando una soluzione incentrata sullo sviluppatore, puoi invocare hook_cron()
un modulo personalizzato per ripulire i vecchi nodi:
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();
}
}
Sulla base della risposta di Shawn Conn, ecco la soluzione completa per i principianti:
Crea un file nella cartella che hai appena creato chiamato: "delete_old_nodes.info.yml" e incolla questo codice:
name: Delete old nodes
description: Deletes nodes older than 30 days.
package: Custom
type: module
version: 1.0
core: 8.x
Crea un file chiamato "delete_old_nodes.module" e inserisci questo codice:
<?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();
}
}
?>
Svuota la cache, quindi vai alla pagina dei moduli - (yoursite.com/admin/modules) - e abilita il tuo modulo (cercando "elimina vecchi nodi", fai clic sulla casella accanto al nome dei moduli e fai clic su Salva).
Fatto! Ogni volta che esegui cron, i nodi / le pagine che sono stati pubblicati -2 settimane, o qualunque cosa tu abbia, da ora verranno eliminati.
Nota: per pianificare l'esecuzione di cron, vai su yoursite.com/admin/config/system/cron
test:
Crea un nodo e modifica la data di pubblicazione, normalmente nella barra laterale destra, a -2 settimane o qualsiasi altra cosa tu abbia. Esegui manualmente cron su yoursite.com/admin/config/system/cron e non dovresti riuscire a trovare il tuo nodo.
Vorrei usare hook_cron()
anche un'implementazione, ma usando il seguente codice.
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);
}
}
Il codice che ho usato per eliminare i nodi è quello che il messaggio di deprecazione entity_delete_multiple()
suggerisce di usare.
Ho anche usato una chiamata per accessCheck(FALSE)
evitare che la query dell'entità restituisca solo i nodi a cui ha accesso l'utente anonimo. (Le attività Cron vengono eseguite come utente anonimo.)
Se poi c'è la possibilità che i nodi da eliminare siano troppi, limiterei il numero di nodi eliminati ogni volta che vengono eseguite le attività 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
, grazie
hook_cron()
implementazione mostrata lo fa già, come si chiama range()
, in modo diverso dalla precedente implementazione.
range()
ho capito, limiterà il numero di nodi cancellato ogni volta operazioni di cron eseguiti. Ma supponiamo di avere sul sito 30 nodi di tipi page
e article
con data di creazione più di 2 settimane fa ... Come eliminare solo i nodi di tipo article
senza eliminare il nodo di tipo page
? ... Scusa le mie umili abilità php ma non ho potuto vedere tale implementazione nel codice sopra! Grazie
Vorrei provare a farlo come tale:
Proverò a provarlo quando ne avrò la possibilità, perché non sono del tutto sicuro di quanto sarà facile / possibile utilizzare la vista in questo modo in 3., ma è sicuramente da lì che inizierei. Ovviamente, questo ha la premessa che non cancellerà i nodi quando diventano ESATTAMENTE 2 settimane, ma dipenderà da quando Cron funzionerà sul tuo sistema; ma, suppongo che entro 3 ore circa sia ancora sufficiente.
(Ho appena notato che questo era per D8; penso che il processo sia comunque valido.)