Drupal 8:删除所有相同类型的节点
Drupal 8: delete all nodes of the same type
我需要删除 Drupal 8 中所有相同类型的节点(有超过 7k 个节点)。
这对 Drupal 7 来说不是问题(数据库查询 + node_delete 或 node_delete_multiple 会解决我的问题)。然而,D8 略有不同:)
请指教,我该怎么做。提前致谢!
好吧,答案就在表面上:
$types = array('my_content_type_name');
$nids_query = db_select('node', 'n')
->fields('n', array('nid'))
->condition('n.type', $types, 'IN')
->range(0, 500)
->execute();
$nids = $nids_query->fetchCol();
entity_delete_multiple('node', $nids);
我建议你使用 "range" 和某种 "batch"(或者只是 re-run 代码多次),因为这是一个非常胖的操作(每个操作 500 个节点是256MB 没问题)。
要执行此代码,您可以编写自定义模块或使用 devel 模块:https://www.drupal.org/project/devel
安装后转到 yoursite_address/devel/php 并在那里执行 php 代码。
应该使用实体查询而不是直接作用于数据库:
$result = \Drupal::entityQuery('node')
->condition('type', 'my_content_type_name')
->execute();
entity_delete_multiple('node', $result);
像其他答案一样设置范围应该不会太困难。
有关详细信息,请参阅 EntityFieldQuery has been rewritten。
Drupal 8 具有按内容类型获取节点的功能,所以我会使用
$nodes = \Drupal::entityTypeManager()
->getStorage('node')
->loadByProperties(array('type' => 'your_content_type'));
foreach ($nodes as $node) {
$node->delete();
}
entity_delete_multiple 自 Drupal 8 起已弃用。0.x 将在 Drupal 9.0.0 之前删除。使用实体存储的delete()方法删除多个实体:
// query all entities you want for example taxonomy term from tags vocabulary
$query = \Drupal::entityQuery('taxonomy_term');
$query->condition('vid', 'tags');
$tids = $query->execute();
$storage_handler = \Drupal::entityTypeManager()->getStorage($entity_type);
$entities = $storage_handler->loadMultiple($tids);
$storage_handler->delete($entities);
要删除某些实体类型的所有实体,我使用改编自上一条评论的代码段:
$entity_types = ['taxonomy_term','node','menu_link_content',];
foreach ($entity_types as $entity_type) {
$query = \Drupal::entityQuery($entity_type);
$ids = $query->execute();
$storage_handler = \Drupal::entityTypeManager()->getStorage($entity_type);
$entities = $storage_handler->loadMultiple($ids);
$storage_handler->delete($entities);
}
您可以使用 Devel module
- 进入管理->配置->开发->生成内容
( admin/config/development/generate/content )
- select 您希望删除其节点的内容类型。
- 检查“删除这些内容类型中的所有内容..”(重要)
- 在“你想生成多少个节点”中输入“0”(重要)
有关说明,请参阅附图。
attached image
最简单的方法是安装 Bulk Delete 模块。适用于 D7 和 D8。
安装模块后,当您点击内容菜单时,您将看到批量删除节点选项卡选项。
它救了我的命 :)
为了方便起见,我附上了截图。
我为此使用 Drupal 控制台
https://docs.drupalconsole.com/ko/commands/entity-delete.html
drupal entity:delete [arguments]
对于 Drupal 9.0 工作正常
$ids = \Drupal::entityQuery('node')
->condition('type', 'article')
->execute();
$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadMultiple($ids);
$storage_handler->delete($entities);
我需要删除 Drupal 8 中所有相同类型的节点(有超过 7k 个节点)。
这对 Drupal 7 来说不是问题(数据库查询 + node_delete 或 node_delete_multiple 会解决我的问题)。然而,D8 略有不同:)
请指教,我该怎么做。提前致谢!
好吧,答案就在表面上:
$types = array('my_content_type_name');
$nids_query = db_select('node', 'n')
->fields('n', array('nid'))
->condition('n.type', $types, 'IN')
->range(0, 500)
->execute();
$nids = $nids_query->fetchCol();
entity_delete_multiple('node', $nids);
我建议你使用 "range" 和某种 "batch"(或者只是 re-run 代码多次),因为这是一个非常胖的操作(每个操作 500 个节点是256MB 没问题)。
要执行此代码,您可以编写自定义模块或使用 devel 模块:https://www.drupal.org/project/devel
安装后转到 yoursite_address/devel/php 并在那里执行 php 代码。
应该使用实体查询而不是直接作用于数据库:
$result = \Drupal::entityQuery('node')
->condition('type', 'my_content_type_name')
->execute();
entity_delete_multiple('node', $result);
像其他答案一样设置范围应该不会太困难。
有关详细信息,请参阅 EntityFieldQuery has been rewritten。
Drupal 8 具有按内容类型获取节点的功能,所以我会使用
$nodes = \Drupal::entityTypeManager()
->getStorage('node')
->loadByProperties(array('type' => 'your_content_type'));
foreach ($nodes as $node) {
$node->delete();
}
entity_delete_multiple 自 Drupal 8 起已弃用。0.x 将在 Drupal 9.0.0 之前删除。使用实体存储的delete()方法删除多个实体:
// query all entities you want for example taxonomy term from tags vocabulary
$query = \Drupal::entityQuery('taxonomy_term');
$query->condition('vid', 'tags');
$tids = $query->execute();
$storage_handler = \Drupal::entityTypeManager()->getStorage($entity_type);
$entities = $storage_handler->loadMultiple($tids);
$storage_handler->delete($entities);
要删除某些实体类型的所有实体,我使用改编自上一条评论的代码段:
$entity_types = ['taxonomy_term','node','menu_link_content',];
foreach ($entity_types as $entity_type) {
$query = \Drupal::entityQuery($entity_type);
$ids = $query->execute();
$storage_handler = \Drupal::entityTypeManager()->getStorage($entity_type);
$entities = $storage_handler->loadMultiple($ids);
$storage_handler->delete($entities);
}
您可以使用 Devel module
- 进入管理->配置->开发->生成内容
( admin/config/development/generate/content ) - select 您希望删除其节点的内容类型。
- 检查“删除这些内容类型中的所有内容..”(重要)
- 在“你想生成多少个节点”中输入“0”(重要)
有关说明,请参阅附图。
attached image
最简单的方法是安装 Bulk Delete 模块。适用于 D7 和 D8。
安装模块后,当您点击内容菜单时,您将看到批量删除节点选项卡选项。
它救了我的命 :)
为了方便起见,我附上了截图。
我为此使用 Drupal 控制台 https://docs.drupalconsole.com/ko/commands/entity-delete.html
drupal entity:delete [arguments]
对于 Drupal 9.0 工作正常
$ids = \Drupal::entityQuery('node')
->condition('type', 'article')
->execute();
$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadMultiple($ids);
$storage_handler->delete($entities);