Réponses:
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();
}
}
Basé sur la réponse de Shawn Conn, voici la solution complète pour les novices:
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
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();
}
}
?>
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).
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.
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.
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);
}
}
article
, merci
hook_cron()
implémentation montrée le fait déjà, comme elle l'appelle range()
, différemment de l'implémentation précédente.
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
& article
avec date de création il y a plus de 2 semaines ... Comment supprimer uniquement les nœuds de type article
sans 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
J'essaierais de le faire comme tel:
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.)