Supprimer un nœud après X semaines de création

14

Comment supprimer un nœud après, par exemple, 2 semaines de création?

RobinSon
la source

Réponses:

18

Si vous recherchez une solution centrée sur le développeur, vous pouvez invoquer hook_cron()un module personnalisé pour nettoyer les anciens nœuds:

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();
  }
}
Shawn Conn
la source
Comment faire avec les règles de Drupal 8?
RobinSon
1
Il s'agissait intentionnellement d'une approche différente de celle du constructeur de site / basée sur les règles. Je demanderais à @UnsettlingTrend de mettre à jour sa réponse en conséquence. Je n'ai pas encore essayé les règles en D8, donc je peux parler d'une solution basée sur ce module.
Shawn Conn
7
Utiliser $ nodes = $ storage-> loadMultiple ($ nids) puis $ storage-> deleteMultiple ($ nodes) est un peu plus rapide, mais à moins que vous ne supprimiez des dizaines de nœuds, ce n'est pas un gros problème.
Berdir
@SiMoNe vous ne pouvez pas encore. Il n'y a pas encore de module de planificateur de règles, plus les règles 8 ne sont pas prêtes pour la production.
Pas de Sssweat
1
Je créerais une approche basée sur la file d'attente pour la mise à l'échelle. Vous n'avez pas besoin de règles.
Kevin
4

Basé sur la réponse de Shawn Conn, voici la solution complète pour les novices:

  1. Accédez à votre répertoire de fichiers racine et créez le dossier "delete_old_nodes"
  2. Créez un fichier dans le dossier que vous venez de créer appelé: "delete_old_nodes.info.yml" et collez-y ce code:

    name: Delete old nodes
    description: Deletes nodes older than 30 days.
    package: Custom
    type: module
    version: 1.0
    core: 8.x
  3. Créez un fichier appelé "delete_old_nodes.module" et mettez-y ce code:

    <?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. Vider le cache, puis accédez à la page des modules - (yoursite.com/admin/modules) - et activez votre module, (en recherchant "supprimer les anciens nœuds", cochez la case par le nom des modules et cliquez sur enregistrer).

  5. Terminé! Chaque fois que vous exécutez cron, les nœuds / pages qui ont été publiés -2 semaines, ou quoi que ce soit, à partir de maintenant seront supprimés.

  6. Remarque: Pour planifier l'exécution de cron, accédez à votresite.com/admin/config/system/cron

Essai:

Créez un nœud et modifiez la date de publication, normalement dans la barre latérale droite, à -2 semaines ou autre. Exécutez manuellement cron sur yoursite.com/admin/config/system/cron et vous ne devriez pas pouvoir trouver votre nœud.

Chris Happy
la source
Vous n'avez pas besoin de la fermeture?>. Cela entraînera des erreurs sur certaines configurations de serveur. Je conseillerais d'avoir une configuration plus structurée en utilisant QueueAPI, de cette façon s'il y a des milliers voire des centaines de nœuds à supprimer, cela ne bloquera pas le système dans le cron op ci-dessus. sitepoint.com/…
Kevin
Huh. Quand je n'avais pas le?>, Le code ne fonctionnait pas pour moi.
Chris Happy
2

J'utiliserais également une hook_cron()implémentation, mais en utilisant le code suivant.

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

Le code que j'ai utilisé pour supprimer les nœuds est celui que le message de dépréciation entity_delete_multiple()suggère d'utiliser.
J'ai également utilisé un appel à accessCheck(FALSE)pour éviter que la requête d'entité renvoie uniquement les nœuds auxquels l'utilisateur anonyme a accès. (Les tâches Cron s'exécutent en tant qu'utilisateur anonyme.)

S'il y a alors la possibilité que les nœuds à supprimer soient trop nombreux, je limiterais le nombre de nœuds supprimés à chaque exécution des tâches 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);
  }
}
kiamlaluno
la source
Je sais que cette question est ancienne mais @kiamlaluno, votre réponse m'a fait gagner du temps! et au lieu de poster une nouvelle question qui sera un double de celle-ci, pourriez-vous s'il vous plaît élaborer davantage sur la façon de limiter la suppression des nœuds au nœud de type article , merci
Elie Masaad
La dernière hook_cron()implémentation montrée le fait déjà, comme elle l'appelle range(), différemment de l'implémentation précédente.
kiamlaluno
Le range()je comprends bien, va limiter le nombre de noeuds supprimés chaque tâches cron exécution. Mais disons que j'ai sur le site 30 nœuds de types page& articleavec date de création il y a plus de 2 semaines ... Comment supprimer uniquement les nœuds de type articlesans supprimer le nœud de type page? ... Excusez mes humbles compétences en php mais je n'ai pas pu voir une telle implémentation dans le code ci-dessus! Merci
Elie Masaad
0

J'essaierais de le faire comme tel:

  1. Créer une vue de tous les nœuds âgés de plus de 2 semaines
  2. Créer une règle système à exécuter sur la maintenance Cron
  3. Dans la configuration des règles, créez une boucle pour parcourir ces résultats de vue
  4. Supprimer chaque nœud

J'essaierai de le tester quand j'en aurai l'occasion, parce que je ne suis pas entièrement sûr de la facilité / possibilité d'utiliser la vue comme celle-ci en 3., mais c'est définitivement par là que je commencerais. Bien sûr, cela vient avec la mise en garde qu'il ne supprimera pas les nœuds lorsqu'ils auront exactement 2 semaines, mais dépendra du moment où Cron s'exécute sur votre système; mais, je suppose que dans les 3 heures environ, c'est encore suffisant.

(Je viens juste de remarquer que c'était pour D8; je pense que le processus est toujours solide.)

Tendance troublante
la source
Je n'ai réalisé D8 qu'après l'avoir tapé. Je sais juste que les règles sont en alpha pour stable pour D8; je ne l'ai pas encore essayé.
UnsettlingTrend
Je suis allé avec la version dev de Rules. Pour ce que j'essayais, cela semblait stable, mais je suis bloqué sur le fait qu'il ne semble pas y avoir de version D8 du module Rules Rules à utiliser pour parcourir les résultats de la vue. S'il y a un moyen d'obtenir des vues dans une règle à laquelle je ne pense pas, cela pourrait fonctionner. Sinon, je ne suis pas sûr.
UnsettlingTrend