Elimina un nodo dopo X settimane dalla sua creazione


14

Come posso eliminare un nodo dopo, ad esempio, 2 settimane dopo la sua creazione?

Risposte:


18

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();
  }
}

Come può farlo con le regole in drupal 8?
RobinSon,

1
Questo era intenzionalmente un approccio diverso da quello del costruttore di siti / approccio basato su regole. Chiederei a @UnsettlingTrend di aggiornare la sua risposta di conseguenza. Non ho ancora provato le regole in D8, quindi posso parlare con la soluzione basata su quel modulo.
Shawn Conn,

7
Usare $ nodes = $ storage-> loadMultiple ($ nids) e quindi $ storage-> deleteMultiple ($ nodes) è un po 'più veloce, ma a meno che tu non stia eliminando dozzine di nodi, non è un grosso problema.
Berdir,

@SiMoNe non puoi ancora. Non esiste ancora un modulo di pianificazione delle regole, inoltre la regola 8 non è pronta per la produzione.
No Sssweat,

1
Vorrei creare un approccio basato sulla coda per ridimensionare. Non hai bisogno di regole.
Kevin,

4

Sulla base della risposta di Shawn Conn, ecco la soluzione completa per i principianti:

  1. Vai alla directory del tuo file radice e crea la cartella "delete_old_nodes"
  2. 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
  3. 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();
      }
    }
    
    ?>
  4. 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).

  5. 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.

  6. 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.


Non hai bisogno della chiusura?>. Ciò causerà errori su alcune configurazioni del server. Consiglierei di avere una configurazione più strutturata usando QueueAPI, in questo modo se ci sono migliaia o addirittura centinaia di nodi da eliminare, non si bloccherà il sistema all'interno della cron op sopra. sitepoint.com/…
Kevin,

Huh. Quando non avessi il?>, Il codice non avrebbe funzionato per me.
Chris Happy

2

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);
  }
}

So che questa domanda è vecchia ma @kiamlaluno la tua risposta mi ha salvato il tempo! e invece di pubblicare una nuova domanda che sarà un duplicato di questa, potresti per favore approfondire di più su come limitare la cancellazione dei nodi al nodo di tipo article , grazie
Elie Masaad,

L'ultima hook_cron()implementazione mostrata lo fa già, come si chiama range(), in modo diverso dalla precedente implementazione.
kiamlaluno

L' 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 pagee articlecon data di creazione più di 2 settimane fa ... Come eliminare solo i nodi di tipo articlesenza eliminare il nodo di tipo page? ... Scusa le mie umili abilità php ma non ho potuto vedere tale implementazione nel codice sopra! Grazie
Elie Masaad,

0

Vorrei provare a farlo come tale:

  1. Crea una vista di tutti i nodi che hanno più di 2 settimane
  2. Crea una regola di sistema per l'esecuzione su Cron
  3. Nella configurazione della regola, creare un ciclo per scorrere su tali risultati della vista
  4. Elimina ogni nodo

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.)


Non ho realizzato D8 fino a quando non l'ho scritto. So solo che le regole sono in alpha per stable per D8; non l'ho ancora provato.
Disordinato:

Sono andato con la versione dev di Rules. Per quello che stavo provando, mi è sembrato stabile, ma sono bloccato dal fatto che sembra non esserci - pianificato altrimenti - la versione D8 del modulo Views Views da usare per scorrere i risultati della vista. Se c'è un modo per ottenere visualizzazioni in una regola a cui non riesco a pensare, potrebbe funzionare. Altrimenti, non ne sono sicuro.
Disordinato
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.