批量更新?


35

我向已经有许多节点的Drupal 7内容类型添加了一个新的(文本)字段。

如何为所有这些节点填充默认值?

Answers:


37

您可以EntityFieldQuery用来检索节点列表,然后使用以下命令更新节点的字段node_save()

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific value within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    node_save($node);
  }
}

如果这是一次性操作,则可以使用Devel模块的Execute PHP函数来运行上述操作:否则,可以创建一个简单的自定义模块。


2
除了使用devel或vbo外,您还可以在完全自举的环境中使用“ drush scr myscript.php”来执行上述代码。
fietserwin

该代码如何更改以适应对术语参考字段执行相同的操作?
Screenack

17

我将使用Views Bulk Operations并使用“ Execute Arbitrary PHP Script”基本上执行上述各项,但是您不必执行所有额外的代码,只需执行您想要的代码的小片段(如$object->field_foo['und'][0]['value'] = 'some_value'


9

如果您只想更新具有某些值的字段,则可以采用性能更高的替代答案:

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    field_attach_presave('node', $node);
    field_attach_update('node', $node);
  }
}

区别在于直接使用field_attach_presavefield_attach_update函数,它们仅正确更新节点字段,而跳过其余的节点保存过程。这样会产生影响,不会调用任何节点的presave / save挂钩,“更改的”日期不会更新为当前日期,等等。根据您的用例,最好使用整个node_save()过程。


4

实际上,VBO(视图批量操作)是一个很好的解决方案。此外,在最新版本中,您将找到“修改实体值”选项,该选项提供了一种非常简便的方法来一次更新节点语言。


2

安装并启用“ 视图批量操作”模块,并创建带有页面显示的视图。

添加=>批量操作:视图中的“内容(Content)”字段。

参考

在此处输入图片说明

选择要设置默认值的字段。

您的标题。在图像中是标签。

保存视图,然后转到它创建的页面。如果结果有一页以上,则可以选择选择当前页面上的所有项目,所有页面上的所有项目,或者可以手动选中与各个节点相对应的复选框。必须至少选中一个复选框才能继续。

现在,您设置默认值并保存。

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.