Answers:
有一个用于该(TM)的模块。
请参阅批量删除。
这将使用Batch API删除节点,以避免在一次调用node_delete_multiple()删除数千个节点时出现超时或内存问题。
批量删除是一个废弃的模块。请参阅替代品:
看一下Devel Generate模块的灵感,这是它的“内容杀死”功能devel_generate_content_kill
:
function devel_generate_content_kill($values) { $results = db_select('node', 'n') ->fields('n', array('nid')) ->condition('type', $values['node_types'], 'IN') ->execute(); foreach ($results as $result) { $nids[] = $result->nid; } if (!empty($nids)) { node_delete_multiple($nids); drupal_set_message(t('Deleted %count nodes.', array('%count' => count($nids)))); } }
因此,我将尝试使用Devel Generate删除所有节点但不创建任何新节点,或者尝试使用example.com/devel/php devel_generate_content_kill(array('node_types' => array('my_node_type')));
直接调用。
在Drupal 8中,一种方法是将EntityQuery()方法与EntityStorageInterface :: delete()方法一起使用:
$result = \Drupal::entityQuery("node")
->condition("type", "YOUR_CONTENT_TYPE_NAME")
// If the update is being executed via drush entityQuery will only
// return the content uid 0 have access to. To return all set
// accessCheck to false since it defaults to TRUE.
->accessCheck(FALSE)
->execute();
$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadMultiple($result);
$storage_handler->delete($entities);
如果您需要应用其他过滤器/条件,则可以查看QueryInterface界面页面
编辑(其他方式,感谢 @ 4k4):
$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadByProperties(["type" => "YOUR_CONTENT_TYPE_NAME"]);
$storage_handler->delete($entities);
如果要测试代码,可以使用:
drush php-eval '$storage_handler = \Drupal::entityTypeManager()->getStorage("node"); $entities = $storage_handler->loadByProperties(["type" => "article"]); $storage_handler->delete($entities);'
这将删除您的所有文章。
$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
entityQuery
该accessCheck
功能,则应在语句中设置。否则,如果您在drush中运行它,则默认情况下accessCheck设置为true,并且uid 0无权访问的任何节点都不会返回。
在drupal安装的根目录中使用以下代码创建一个文件,然后执行该文件。
<?php
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$aquery= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'company'");
while ($row = db_fetch_object($aquery)) {
node_delete($row->nid);
}
?>
您可以在Drupal 7中使用Devel模块的Execute PHP Code部分执行此操作,方法是输入:
$result= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'TYPE'");
foreach ($result as $record) {
node_delete($record->nid);
}
如果使用Drush并删除所有模块,请在终端中执行以下操作:
drush delete-all [content-type-machine-name]
Examples:
drush delete-all article Delect all article nodes.
drush delete-all all Delete nodes of all types.
drush delete-all --reset Delete nodes of all types, and reset node, revision and comment counters.
drush delete-all users Delete users.
Options:
--reset Reset counter for node, revision and comment tables.
--roles pick roles
Views Bulk操作提供了启用BatchAPI的可配置节点管理屏幕,该屏幕允许按类型过滤,选择符合搜索条件的所有节点等。
那是我在Drupal 6中的实用解决方案-除了批量删除,您还可以批量编辑节点并做很多其他事情。
看来Drupal 7版本尚未准备好-但我会在D7发行版中关注该模块。
使用Devel模块,使用drush:
drush genc 0 --types=article --kill
或按以下说明在用户界面中:http : //befused.com/drupal/delete-nodes-devel
devel_generate
需要启用Devel子模块。对于多种类型,它是drush genc 0 --kill --types="article, page"
我使用Delete all module(删除所有模块),它与D8配合使用,并提供了非常有用的drush命令。例如,要删除article
内容类型的所有内容:
drush delete-all article
该模块用于删除站点中的所有内容和/或用户。这主要是一个开发人员工具,在某些情况下可以派上用场
https://www.drupal.org/project/delete_all
就像批量删除模块将使用批处理api删除某个节点类型的任何节点一样。建议将Views Batch Operations模块(VBO)用于少量节点。但是,如果必须删除10.000个节点,则此模块可能是一个更好的选择。
以编程方式删除内容类型的所有节点,这是一个帮助函数:
function _delete_all_nodes_of_type($type = '') {
// Return all nids of nodes of type.
$nids = db_select('node', 'n')
->fields('n', array('nid'))
->condition('n.type', $type)
->execute()
->fetchCol(); // returns an indexed array
if (!empty($nids)) {
node_delete_multiple($nids);
drupal_set_message(format_plural(count($nids), count($nids) . ' node Deleted.', count($nids) . ' nodes Deleted.'));
}
}
我最终使用了db_delete,不需要任何模块:
<?php
db_delete('node')
->condition('type', 'MY_CONTENT_TYPE')
->execute();
?>
编辑/警告:请参阅下面的Berdir评论。此方法不会清除与节点有关的所有数据。
如果您不想编码,可以尝试此模块, https://drupal.org/project/total_control
只需转到信息中心->内容,选择所有内容(您可以按内容类型过滤),然后选择“删除项目”