Excluir um nó após X semanas em que ele foi criado

15

Como posso excluir um nó após, por exemplo, 2 semanas após a sua criação?

RobinSon
fonte

Respostas:

18

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();
  }
}
Shawn Conn
fonte
Como fazer isso com as regras do drupal 8?
Robinson
11
Essa foi intencionalmente uma abordagem diferente da abordagem baseada no construtor de sites / regras. Eu pediria ao @UnsettlingTrend para atualizar sua resposta de acordo. Ainda não testei as Regras no D8, para poder falar com a solução baseada nesse módulo.
Shawn Conn
7
Usar $ nodes = $ storage-> loadMultiple ($ nids) e, em seguida, $ storage-> deleteMultiple ($ nodes) é um pouco mais rápido, mas, a menos que você esteja excluindo dezenas de nós, não é um grande problema.
Berdir
@SiMoNe você ainda não pode. Ainda não existe um módulo do planejador de regras, mais as Regras 8 não estão prontas para produção.
No Sssweat
11
Eu criaria uma abordagem baseada em fila para expansão. Você não precisa de regras.
Kevin
4

Baseado na resposta de Shawn Conn, aqui está a solução completa para iniciantes:

  1. Vá para o diretório do arquivo raiz e crie a pasta "delete_old_nodes"
  2. 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
  3. 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();
      }
    }
    
    ?>
  4. 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).

  5. 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.

  6. 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ó.

Chris Happy
fonte
Você não precisa do fechamento?>. Isso causará erros em algumas configurações do servidor. Eu recomendaria ter uma configuração mais estruturada usando o QueueAPI, dessa forma, se houver milhares ou centenas de nós para excluir, ele não desligará o sistema no cron op acima. sitepoint.com/…
Kevin
Hã. Quando eu não tinha o?>, O código não funcionaria para mim.
Chris Happy
2

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);
  }
}
kiamlaluno
fonte
Eu sei que esta pergunta é antiga, mas @kiamlaluno sua resposta economizou meu tempo! e em vez de postar uma nova pergunta que será uma duplicata de um presente, você poderia por favor elaborar mais sobre como limitar a eliminação de nós para o nó do tipo article , obrigado
Elie Masaad
A última hook_cron()implementação mostrada já faz isso, como é chamado range(), de forma diferente da implementação anterior.
kiamlaluno
O 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 pagee articlecom data de criação mais de 2 semanas atrás ... Como excluir apenas os nós do tipo articlesem 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
Elie Masaad
0

Eu tentaria fazê-lo da seguinte maneira:

  1. Crie uma visualização de todos os nós com mais de 2 semanas
  2. Crie uma regra do sistema para executar na manutenção do Cron
  3. Na configuração da regra, crie um loop para iterar sobre os resultados da exibição
  4. Exclua cada nó

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

Tendência inquietante
fonte
Eu não percebi o D8 até depois de digitar isso. Eu só sei que as regras estão em alfa para estável para o D8; ainda não tentei.
UnsettlingTrend
Eu fui com a versão dev do Rules. Para o que eu estava tentando, parecia estável, mas estou preso ao fato de que parece não haver uma versão D8 do módulo Views Rules a ser usada para fazer um loop nos resultados da exibição. Se houver uma maneira de obter Visualizações em uma Regra que eu não consigo pensar, pode funcionar. Caso contrário, não tenho certeza.
UnsettlingTrend