Answers:
您可以创建如下函数:
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 储存库中有一个示例,说明如何执行此操作(请查看底部的“命令”部分)。
安装devel模块,并使用drush删除所有节点,
$ drush genc --kill 0 0
您还可以提供类型选项,
$ drush genc --kill --types=article 0 0
devel_generate
模块包含在devel中,但是drush en devel_generate
通常需要使用genc 启用该模块来创建节点,因此最后的0 0告诉它不要创建任何新内容,而--kill则删除已存在的内容。
我想你可以使用以下命令
drush node_delete <nid>
编辑:找到一个模块,该模块执行与问题相关的操作
http://drupal.org/project/delete_all
用法
冲刺
drush delete-all
例: drush delete-all article
delete_all
尚未移植到Drupal 8上,但是genc答案有效。
这样的事情会起作用(未经测试):
$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可以确保触发所有正确的钩子。除其他事项外,他们还将删除节点修订和字段数据(及其修订),因此您在数据库中没有孤立的数据。
在此线程上有一些好主意。如果您不想真正地进行任何编程并且想使用Drush,则可以查看Delete All贡献的模块:
冲刺 删除全部 示例:草草删除所有文章 Drupal 7版本上的Drush 删除所有节点,特定内容类型的节点或用户。 例子: drush delete-all article选择所有文章节点。 drush delete-all all删除所有类型的节点。 drush delete-all --reset删除所有类型的节点,并重置节点,修订和注释计数器。 drush delete-all users删除用户。 选项: --reset重置节点,修订和注释表的计数器。 -角色扮演角色 别名:da
VBO具有Drush集成。创建节点的VBO视图,通过Drush(使用drush vbo-execute
)执行它,将节点类型作为参数传递。
您还可以创建一个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
呢?
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);
更新@kenorb提供的答案。
在Drupal 8中
drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'
您可以使用
drush node_delete NID
删除特定节点,但是如果您想按内容类型删除所有节点,我想您可以使用批处理api创建drush插件。
您也可以使用devel模块执行此操作,如我可以使用Drush删除给定内容类型的节点所回答的那样。
安装devel模块,并使用drush删除所有节点,
$ drush genc --kill 0 0
您还可以提供类型选项,
$ drush genc --kill --types =文章0 0