创建X周后删除节点


14

例如,在创建节点2周后,如何删除该节点?

Answers:


18

如果您正在寻找以开发人员为中心的解决方案,则可以hook_cron()在自定义模块中调用以清理旧节点:

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

如何使用drupal 8中的规则?
罗宾逊

1
这是故意与网站构建者/基于规则的方法不同的方法。我会要求@UnsettlingTrend相应地更新他的答案。我还没有尝试过D8中的“规则”,所以我可以谈谈基于该模块的解决方案。
肖恩·康

7
使用$ nodes = $ storage-> loadMultiple($ nids)然后使用$ storage-> deleteMultiple($ nodes)速度更快,但是除非您要删除数十个节点,否则这不是什么大问题。
贝尔迪尔

@SiMoNe您还不能。尚无规则调度程序模块,此外规则8尚未准备就绪。
没有Sssweat

1
我将创建一种基于队列的扩展方法。您不需要规则。
凯文

4

根据Shawn Conn的回答,这是针对新手的完整解决方案:

  1. 转到您的根文件目录并创建文件夹“ delete_old_nodes”
  2. 在刚刚创建的文件夹中创建一个文件,名为“ delete_old_nodes.info.yml”,并将以下代码粘贴到其中:

    name: Delete old nodes
    description: Deletes nodes older than 30 days.
    package: Custom
    type: module
    version: 1.0
    core: 8.x
  3. 创建一个名为“ delete_old_nodes.module”的文件,并将以下代码放入其中:

    <?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. 刷新缓存,然后导航到模块页面—(yoursite.com/admin/modules)—并启用您的模块(通过搜索“删除旧节点”,单击模块名称旁边的复选框,然后单击“保存”)。

  5. 做完了!每当您运行cron时,从现在起-2周内发布的节点/页面或您拥有的任何内容都将被删除。

  6. 注意:要安排cron的运行时间,请访问yoursite.com/admin/config/system/cron

测试:

创建一个节点并将发布日期(通常在右侧栏中)更改为-2周或您拥有的任何日期。在yoursite.com/admin/config/system/cron上手动运行cron,您应该找不到节点。


您不需要关闭?>。这将在某些服务器设置上导致错误。我建议使用QueueAPI进行更结构化的设置,这样一来,如果要删除数千甚至数百个节点,则不会在上面的cron op中挂断系统。sitepoint.com/…–
凯文(Kevin)

嗯 当我没有?>时,代码对我不起作用。
克里斯·欢乐

2

我也将使用一个hook_cron()实现,但是使用以下代码。

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

我用来删除节点的代码是entity_delete_multiple()建议弃用消息使用的代码。
我还使用了调用以accessCheck(FALSE)避免实体查询仅返回匿名用户有权访问的节点。(Cron任务以匿名用户身份运行。)

如果那样的话,删除的节点太多了,我将限制每次运行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的答案节省了我的时间!而不是发布将与该问题重复的新问题,请您详细说明如何将节点的删除限制为类型为node的问题 article,谢谢
Elie Masaad19年

hook_cron()显示的最后一个实现,正如它所说的那样,已经range()不同于先前的实现。
kiamlaluno

range()我了解,每次cron任务运行时,都会限制删除的节点数。但是要说我的网站上有30个类型为pagearticle创建日期超过2周的节点articlepage ... 如何仅删除类型的节点而不删除类型的节点...不好意思的php技巧,但是我在上面的代码中看不到这种实现!谢谢
Elie Masaad

0

我会尝试这样做:

  1. 创建所有2周以上节点的视图
  2. 创建系统规则以在Cron维护上运行
  3. 在规则配置中,创建一个循环以迭代这些视图结果
  4. 删除每个节点

如果有机会,我将尝试对其进行测试,因为我不完全肯定使用3.中的视图将多么容易/可行,但这绝对是我的起点。当然,这附带了一个警告:它不会在确切的两个星期大时删除节点,而是取决于Cron在系统上运行的时间。但是,我认为3个小时左右就足够了。

(我只是注意到这是针对D8的;尽管如此,我认为该过程仍然很合理。)


直到我键入D8,我才意识到。我只知道规则对于D8来说是稳定的。还没有尝试过。
UnsettlingTrend

我选择了规则的开发版本。就我所尝试的而言,它似乎很稳定,但是我坚持认为,似乎没有(除非另有计划)D8版本的“视图规则”模块可用于遍历视图结果。如果有一种我无法想到的获取视图规则的方法,它可能会起作用。否则,我不确定。
UnsettlingTrend
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.