Answers:
如果您正在寻找以开发人员为中心的解决方案,则可以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();
}
}
根据Shawn Conn的回答,这是针对新手的完整解决方案:
在刚刚创建的文件夹中创建一个文件,名为“ 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
创建一个名为“ 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();
}
}
?>
刷新缓存,然后导航到模块页面—(yoursite.com/admin/modules)—并启用您的模块(通过搜索“删除旧节点”,单击模块名称旁边的复选框,然后单击“保存”)。
做完了!每当您运行cron时,从现在起-2周内发布的节点/页面或您拥有的任何内容都将被删除。
注意:要安排cron的运行时间,请访问yoursite.com/admin/config/system/cron
测试:
创建一个节点并将发布日期(通常在右侧栏中)更改为-2周或您拥有的任何日期。在yoursite.com/admin/config/system/cron上手动运行cron,您应该找不到节点。
我也将使用一个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);
}
}
article
,谢谢
hook_cron()
显示的最后一个实现,正如它所说的那样,已经range()
不同于先前的实现。
range()
我了解,每次cron任务运行时,都会限制删除的节点数。但是要说我的网站上有30个类型为page
&article
创建日期超过2周的节点article
page
... 如何仅删除类型的节点而不删除类型的节点?...不好意思的php技巧,但是我在上面的代码中看不到这种实现!谢谢
我会尝试这样做:
如果有机会,我将尝试对其进行测试,因为我不完全肯定使用3.中的视图将多么容易/可行,但这绝对是我的起点。当然,这附带了一个警告:它不会在确切的两个星期大时删除节点,而是取决于Cron在系统上运行的时间。但是,我认为3个小时左右就足够了。
(我只是注意到这是针对D8的;尽管如此,我认为该过程仍然很合理。)