Eliminar un nodo después de X semanas fue creado

14

¿Cómo puedo eliminar un nodo después de, por ejemplo, 2 semanas que se ha creado?

RobinSon
fuente

Respuestas:

18

Si está buscando una solución centrada en el desarrollador, puede invocar hook_cron()en un módulo personalizado para limpiar 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();
  }
}
Shawn Conn
fuente
¿Cómo puedo hacerlo con reglas en drupal 8?
RobinSon
1
Este fue intencionalmente un enfoque diferente al del creador del sitio / enfoque basado en reglas. Le pediría a @UnsettlingTrend que actualice su respuesta en consecuencia. Todavía no he probado las reglas en D8, por lo que puedo hablar con la solución basada en ese módulo.
Shawn Conn
77
Usar $ nodo = $ almacenamiento-> loadMultiple ($ nids) y luego $ almacenamiento-> deleteMultiple ($ nudos) es un poco más rápido, pero a menos que esté eliminando docenas de nodos, no es un gran problema.
Berdir
@SiMoNe aún no puedes. Todavía no hay un módulo de planificador de reglas, además, las Reglas 8 no están listas para la producción.
No Sssweat
1
Crearía un enfoque basado en la cola para escalar. No necesitas reglas.
Kevin
4

Basado en la respuesta de Shawn Conn, aquí está la solución completa para los 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 llamada: "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:

    <?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. Vacíe la memoria 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 cron manualmente en yoursite.com/admin/config/system/cron y no podrá encontrar su nodo.

Chris feliz
fuente
¿No necesitas el cierre?>. Eso provocará errores en algunas configuraciones de servidor. Aconsejaría tener una configuración más estructurada usando QueueAPI, de esa manera si hay miles o incluso cientos de nodos para eliminar, no colgará el sistema dentro de la operación cron anterior. sitepoint.com/…
Kevin
Huh Cuando no tenía el?>, El código no me funcionaba.
Chris Happy
2

También usaría una hook_cron()implementació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 entity_delete_multiple()sugiere el mensaje de desaprobación .
También utilicé una llamada para accessCheck(FALSE)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 demasiado, limitaría la cantidad de nodos eliminados cada vez que se ejecutan 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);
  }
}
kiamlaluno
fuente
Sé que esta pregunta es antigua, pero @kiamlaluno su respuesta me ahorró tiempo. y en lugar de publicar una nueva pregunta que será un duplicado de esta, ¿podría explicar más sobre cómo limitar la eliminación de nodos a tipo de nodo? article Gracias
Elie Masaad
La última hook_cron()implementación mostrada ya hace eso, como lo llama range(), de manera diferente a la implementación anterior.
kiamlaluno
Según range()tengo entendido, limitará la cantidad de nodos eliminados cada vez que se ejecutan tareas cron. Pero digamos que tengo en el sitio 30 nodos de tipos pagey articlecon fecha de creación hace más de 2 semanas ... ¿Cómo eliminar solo los nodos de tipo articlesin eliminar el nodo de tipo page? ... Disculpe mis humildes habilidades de php pero no pude ver tal implementación en el código anterior. Gracias
Elie Masaad
0

Intentaría hacerlo como tal:

  1. Cree una vista de todos los nodos que tengan más de 2 semanas
  2. Cree una regla del sistema para ejecutar el mantenimiento de Cron
  3. En la configuración de la regla, cree un bucle para iterar sobre los resultados de la vista
  4. Eliminar cada nodo

Intentaré probarlo cuando tenga la oportunidad, porque no estoy completamente seguro de lo fácil / posible que será utilizar la vista de esa manera en 3., pero definitivamente es ahí donde comenzaría. Por supuesto, esto viene con la advertencia de que no eliminará los nodos cuando tengan EXACTAMENTE 2 semanas de edad, sino que dependerá de cuándo Cron se ejecute en su sistema; pero, supongo que dentro de 3 horas más o menos sigue siendo suficiente.

(Solo me di cuenta de que esto era para D8; creo que el proceso todavía es sólido).

Tendencia inquietante
fuente
No me di cuenta de D8 hasta después de que escribí eso. Solo sé que las reglas están en alfa para estable para D8; No lo he probado todavía.
UnsettlingTrend
Fui con la versión de desarrollo de Reglas. Para lo que estaba intentando, parecía estable, pero estoy atascado en el hecho de que parece que no hay una versión D8 del módulo de Reglas de Vistas, planeada de otra manera, para usar para recorrer los resultados de la vista. Si hay una manera de obtener Vistas en una Regla que no se me ocurre, podría funcionar. De lo contrario, no estoy seguro.
UnsettlingTrend