我可以使用Drush删除给定内容类型的节点吗?


13

只是想知道Drush是否能够删除给定内容类型的节点。

就像是: $ drush delete-node --type=MyContentType

如果不可能,是否可以创建类似的方法

Answers:


4

您可以创建如下函数:

function MYMODULE_delete_all_the_things() {
  $query = new EntityFieldQuery;

  $result = $query->entityCondition('entity_type', 'node')
    ->propertyCondition('type', 'YOUR-CONTENT-TYPE')
    ->execute();

  if (isset($result['node']) && count($result['node'])) {

    $node_ids = array_keys($result['node']);

    node_delete_multiple($node_ids);
  }
}

注意-您也可以使用简单的SELECT查询,但是在您使用实体时,使用EntityFieldQuery似乎更明智/更常见。

更改或添加参数也应该很容易。您也可以很容易地将其放入Drush命令中-在Drush 储存库中有一个示例,说明如何执行此操作(请查看底部的“命令”部分)。


我看到了,这似乎是资源库链接显示了如何正确添加drush方法。
Chefnelone 2012年

对!自述文件还有一些不同的方法也可以实现它们!
Chapabu 2012年

21

安装devel模块,并使用drush删除所有节点,

$  drush genc --kill 0 0 

您还可以提供类型选项,

$  drush genc --kill --types=article 0 0

聪明,我喜欢。
m4olivei 2014年

3
这适用于D8。该devel_generate模块包含在devel中,但是drush en devel_generate 通常需要使用genc 启用该模块来创建节点,因此最后的0 0告诉它不要创建任何新内容,而--kill则删除已存在的内容。
威廉·特雷尔

15

我想你可以使用以下命令

drush node_delete <nid>

编辑:找到一个模块,该模块执行与问题相关的操作

http://drupal.org/project/delete_all

用法

冲刺

drush delete-all

例: drush delete-all article


我的意思是按内容类型删除所有节点。
Chefnelone 2012年

您是否尝试过该模块drupal.org/project/delete_all 用法Drush drush delete-all示例:drush dall-all article
ninjascorner 2012年

在哪里可以找到drush node_delete <nid>命令?
Adrian Cid Almaguer

为了节省人们的时间,截至2016年12月,delete_all 尚未移植到Drupal 8上,但是genc答案有效。
威廉·特瑞尔


5

这样的事情会起作用(未经测试):

$query = new EntityFieldQuery();

$entities = $query->entityCondition('entity_type', 'node', '=')
  ->entityCondition('bundle', 'Announcements')
  ->execute();

$nids = array_keys($entities['node']);

node_delete_multiple($nids);

这会发现所有的节点与内容类型Annoucements使用EntityFieldQuery()。然后$nids从结果中获取所有内容,并使用删除它们node_delete_multiple()

您可以获取此代码,将其放在单独的PHP文件中,然后使用执行drush scr

使用API​​可以确保触发所有正确的钩子。除其他事项外,他们还将删除节点修订和字段数据(及其修订),因此您在数据库中没有孤立的数据。


5

在此线程上有一些好主意。如果您不想真正地进行任何编程并且想使用Drush,则可以查看Delete All贡献的模块:

冲刺
删除全部
示例:草草删除所有文章

Drupal 7版本上的Drush

删除所有节点,特定内容类型的节点或用户。

例子:
 drush delete-all article选择所有文章节点。
 drush delete-all all删除所有类型的节点。
 drush delete-all --reset删除所有类型的节点,并重置节点,修订和注释计数器。
 drush delete-all users删除用户。

选项:
 --reset重置节点,修订和注释表的计数器。
 -角色扮演角色

别名:da

4

VBO具有Drush集成。创建节点的VBO视图,通过Drush(使用drush vbo-execute)执行它,将节点类型作为参数传递。


我认为这就是我所需要的。仅两个问题:执行视图的drush方法是什么?并且此方法是否比在浏览器中执行视图更快?
Chefnelone 2012年

编辑答案以指定确切的drush命令。是的,它将更快,因为这样不会渲染视图。
Bojan Zivanovic 2012年

1

您还可以创建一个drush脚本(假设它称为“ bulk_delete.php”,位于Drupal根文件夹下):

#!/usr/bin/env drush

$res = db_delete('node')
  ->condition('type', 'mycontenttype', '=')
  ->execute();

echo "deleted:" . $res;

这绝对是最快的方法:使用Drupal函数db_delete直接查询db

用法:

:~# cd /var/www/www.mysite.com
:~# drush --uri=www.mysite.com scr bulk_delete.php 

Doc:https : //api.drupal.org/api/drupal/includes! database! database.inc/function/db_delete/7

警告:此过程不会删除其字段的数据。无论如何,可以将相同的过程应用于这些字段(查看每个字段的“捆绑”列)。例如:

#!/usr/bin/env drush

$field_tables = array(
  'field_data_field_body',
  'field_data_field_mycoolfield',
  'field_revision_body',
  'field_revision_field_mycoolfield'
);

foreach ($field_tables as $field_table) {
  $res = db_delete($field_table)
    ->condition('bundle', 'mycontenttype', '=')
    ->execute();

  echo "deleted:" . $res . "\n\n";
}

其中“ mycontenttype”是第一个查询中使用的那个。


为什么会这样'nid' > 5000呢?
ЕлинЙ.

这是一个例子,就像类型。
Mauro Mascia

但是原始的发布者没有提到这种情况,这就是为什么我认为该示例不相关,因此具有误导性。
ЕлинЙ.

1

Drupal 7

尝试以下一种方法,它会从Drupal中删除所有MyContentType节点:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

或者,您可以根据实体类型名称(例如节点)删除所有实体:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

注意:node是您的实体类型名称,可以根据需要进行更改。


如果出现内存错误或超时错误,则可以在之前添加以下几组$res

ini_set('memory_limit', -1); ini_set('max_execution_time', 0);

1

要删除特定内容类型的所有节点,您可以尝试通过drush运行以下命令:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

其中MyContentType是您计算机的内容类型名称(例如Page)。


1

对于单个节点:

$ drush php-eval 'node_delete($node->nid);'

drush php-eval
在引导Drupal之后评估任意php代码


请添加更多详细信息以解释您的代码,否则,这可能被认为是低质量的答案(因此,可能会通过审核将其删除)。
Pierre.Vriens

1

更新@kenorb提供的答案。

在Drupal 8中

drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'

dev ev'$ type ='\''node'\''; entity_delete_multiple($ type,\ Drupal :: entityQuery($ type)-> execute());'
geek-merlin

要更新现有答案,请发表评论以提出修改建议。
leymannx

0

您可以使用

drush node_delete NID 删除特定节点,但是如果您想按内容类型删除所有节点,我想您可以使用批处理api创建drush插件。


我找不到drush node_delete NID命令。
Adrian Cid Almaguer

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.