Saltar al contenido

Drupal: elimine un nodo después de X semanas de su creación

Jairo, miembro de nuestro staff, nos ha hecho el favor de redactar este tutorial porque conoce a la perfección dicho tema.

Solución:

Si está buscando una solución centrada en el desarrollador, puede invocar hook_cron() en un módulo personalizado para limpiar los nodos antiguos:

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

Basado en la respuesta de Shawn Conn, aquí está la solución completa para principiantes:

  1. Vaya a su directorio de archivos raíz y cree la carpeta “delete_old_nodes”

  2. Cree un archivo en la carpeta que acaba de crear llamado: “delete_old_nodes.info.yml” y pegue este código en él:

    name: Delete old nodes
    description: Deletes nodes older than 30 days.
    package: Custom
    type: module
    version: 1.0
    core: 8.x
    
  3. Cree un archivo llamado “delete_old_nodes.module” y coloque este código en él:

    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. Vacíe el caché, luego navegue a la página de módulos (yoursite.com/admin/modules) y habilite su módulo (buscando “eliminar nodos antiguos”, haga clic en la casilla de verificación junto al nombre de los módulos y haga clic en guardar).

  5. ¡Hecho! Cada vez que ejecute cron, los nodos/páginas que se publicaron -2 semanas, o lo que sea que tenga, a partir de ahora se eliminarán.

  6. Nota: para programar cuándo se ejecuta cron, vaya a yoursite.com/admin/config/system/cron

Pruebas:

Cree un nodo y cambie la fecha de publicación, normalmente en la barra lateral derecha, a -2 semanas o lo que sea que tenga. Ejecute manualmente cron en yoursite.com/admin/config/system/cron y no debería poder encontrar su nodo.

usaría un hook_cron() implementación también, pero usando el siguiente código.

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

El código que utilicé para eliminar los nodos es el que aparece en el mensaje de desaprobación entity_delete_multiple() sugiere usar.
También usé una llamada a accessCheck(FALSE) para evitar que la consulta de entidad devuelva solo los nodos a los que tiene acceso el usuario anónimo. (Las tareas de Cron se ejecutan como usuario anónimo).

Si existe la posibilidad de que los nodos para eliminar sean demasiados, limitaría la cantidad de nodos eliminados cada vez que se ejecutan las tareas 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);
  

Reseñas y valoraciones del tutorial

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *