Respostas:
Se você está procurando uma solução centrada no desenvolvedor, pode invocar hook_cron()
um módulo personalizado para limpar os nós antigos:
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();
}
}
Baseado na resposta de Shawn Conn, aqui está a solução completa para iniciantes:
Crie um arquivo na pasta que você acabou de criar chamada: "delete_old_nodes.info.yml" e cole este código nele:
name: Delete old nodes
description: Deletes nodes older than 30 days.
package: Custom
type: module
version: 1.0
core: 8.x
Crie um arquivo chamado "delete_old_nodes.module" e coloque este código nele:
<?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();
}
}
?>
Limpe o cache e navegue até a página dos módulos - (yoursite.com/admin/modules) - e ative o módulo (pesquisando "excluir nós antigos", clique na caixa de seleção com o nome dos módulos e clique em salvar).
Feito! Sempre que você executar o cron, os nós / páginas que foram publicados -2 semanas, ou o que você tiver, a partir de agora serão excluídos.
Nota: Para agendar a execução do cron, acesse yoursite.com/admin/config/system/cron
Teste:
Crie um nó e altere a data de publicação, normalmente na barra lateral direita, para -2 semanas ou o que você tiver. Execute manualmente o cron em yoursite.com/admin/config/system/cron e você não poderá encontrar seu nó.
Eu usaria uma hook_cron()
implementação também, mas usando o código a seguir.
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);
}
}
O código que eu usei para excluir os nós é aquele que a mensagem de descontinuação entity_delete_multiple()
sugere usar.
Também usei uma chamada para accessCheck(FALSE)
evitar que a consulta da entidade retorne apenas os nós aos quais o usuário anônimo tem acesso. (Tarefas Cron executadas como usuário anônimo.)
Se houver a possibilidade de excluir os nós em excesso, eu limitaria o número de nós excluídos sempre que as tarefas cron forem executadas.
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
, obrigado
hook_cron()
implementação mostrada já faz isso, como é chamado range()
, de forma diferente da implementação anterior.
range()
que eu entendo, vai limitar o número de nós excluídos cada vez tarefas cron. Mas digamos que eu tenha no site 30 nós de tipos page
e article
com data de criação mais de 2 semanas atrás ... Como excluir apenas os nós do tipo article
sem excluir o nó do tipo page
? ... Desculpe minhas humildes habilidades de php, mas não pude ver essa implementação no código acima! Graças
Eu tentaria fazê-lo da seguinte maneira:
Tentarei testá-lo quando tiver uma chance, porque não tenho muita certeza de quão fácil / possível será utilizar a visualização como aquela em 3., mas é definitivamente por aí que eu começaria. Obviamente, isso vem com a ressalva de que ele não excluirá os nós quando completarem exatamente 2 semanas de idade, mas dependerá de quando o Cron for executado no seu sistema; mas, suponho que dentro de três horas ou mais ainda seja suficiente.
(Eu só notei que isso era para o D8; acho que o processo ainda está bom.)