Respuestas:
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();
}
}
Basado en la respuesta de Shawn Conn, aquí está la solución completa para los principiantes:
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
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();
}
}
?>
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).
¡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.
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.
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);
}
}
article
Gracias
hook_cron()
implementación mostrada ya hace eso, como lo llama range()
, de manera diferente a la implementación anterior.
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 page
y article
con fecha de creación hace más de 2 semanas ... ¿Cómo eliminar solo los nodos de tipo article
sin 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
Intentaría hacerlo como tal:
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).