如何快速重新保存站点上的所有节点(以触发在内容更新时激活的规则)?


24

我在网站上配置某种内容类型时犯了一些错误。为了解决这些错误,我制定了一个规则,在“更新现有内容时”执行一些操作。但是,我不想浏览我的站点并手动一次又一次地保存所有节点。是否可以使用“规则”或“视图批量操作”快速重新保存所有节点?

Answers:


22

VBO具有“执行PHP代码”操作。运行它,然后输入“ node_save($ entity);”。(不带引号)在文本框中。这将解决问题,同时为您处理超时。


1
啊,快得多了:)
克莱夫(Clive)

5
VBO中有一个“保存内容”的选项,无需编写您自己的PHP即可执行相同操作。
stevenw00 2014年

我找不到“保存内容”选项,但是您提到的php方法效果很好!谢谢!
hockey2112

尝试了php和vbo方法都没有成功。在我的用例中,只有手册保存会正确更新表字段的标签。奇怪...
Bisonbleu 2014年

14

我不了解规则或VBO,但您可以使用简短的代码段来获得相同的结果:

$nids = db_query('SELECT nid FROM {node}')->fetchCol();
foreach (node_load_multiple($nids) as $node) {
  node_save($node);
}

如果您有很多节点可能需要一些时间,那么如果您的服务器允许,最好在该代码开始时延长时间限制,如果这是一个限制,则可以延长到无限时间:

set_time_limit(0);

12

您可以使用node_mass_update()函数:

module_load_include('inc', 'node', 'node.admin');
$nids = db_query('SELECT nid FROM {node}')->fetchCol();
node_mass_update($nids, array());

很好,因为您无需担心时间限制。如果节点数超过10,则将自动开始进行节点更新的批处理。


5
在超过200,000个节点上完美工作。为您处理批次。如果启用了devel模块,你可以简单地粘贴在页面上面的代码“/ devel的/ PHP的
2pha

1
出色的解决方案在后台运行,因此不会出现超时或杀死站点性能的情况
Daniel Waters

5

更新:我刚刚创建了Resave All Nodes。目前,它仅包含触发批处理以重新保存选定节点类型的所有节点的表单。目前处于Alpha模式。我计划添加一个Drush命令(测试版)和一些测试(稳定的)。

Drupal重新保存所有节点表单屏幕截图


Resave节点。它旨在用于cron运行。但是您也可以手动触发它。只需选择应恢复哪种内容类型的节点即可。

通过单击“立即重新保存节点”来运行手动重新保存之前,您必须先“保存配置”(选择cron类型和内容类型)。


2

转到管理员/内容并按您的内容类型进行过滤-仅发布。全选,然后从操作下拉列表中选择“更改值”。点击“执行”。在下一页上,从属性中选择“状态”并保持发布状态。单击“下一步”。所有已发布的节点将重新保存,而不会发生任何更改。

对未发布的节点重复此操作(但请选择“未发布”作为属性)。

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.