ฉันมีหลายพันโหนดของประเภทเนื้อหาที่เฉพาะเจาะจง การใช้เว็บอินเตอร์เฟส (example.com/admin/content) ฉันสามารถลบได้ครั้งละประมาณ 50 เท่านั้น ฉันจะลบออกอย่างรวดเร็วได้อย่างไร
ฉันมีหลายพันโหนดของประเภทเนื้อหาที่เฉพาะเจาะจง การใช้เว็บอินเตอร์เฟส (example.com/admin/content) ฉันสามารถลบได้ครั้งละประมาณ 50 เท่านั้น ฉันจะลบออกอย่างรวดเร็วได้อย่างไร
คำตอบ:
มีโมดูลสำหรับ (TM) นั้น
ซึ่งจะใช้ Batch API เพื่อลบโหนดเพื่อหลีกเลี่ยงการหมดเวลาหรือปัญหาหน่วยความจำเมื่อลบโหนดนับพันด้วยการเรียก node_delete_multiple () เพียงครั้งเดียว
การลบจำนวนมากเป็นโมดูลที่ถูกทิ้งร้าง ดูทางเลือกอื่น ๆ :
ดูโมดูล Devel Generate สำหรับแรงบันดาลใจนี่คือฟังก์ชัน "content kill" 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 ถูกตั้งค่าเป็นจริงและโหนดใด ๆ ที่ uid 0 ไม่มีสิทธิ์เข้าถึงจะไม่ถูกส่งคืน
หากคุณต้องการทำผ่าน UI อย่างหมดจดคุณสามารถใช้โมดูล devel_generate
วิธีนี้จะไม่มีการสร้างโหนดและโหนดทั้งหมดของประเภทที่เลือกจะถูกลบ
สร้างไฟล์ด้วยโค้ดด้านล่างในรูทของการติดตั้ง 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 โดยใช้ Execute PHP Code ส่วนหนึ่งของโมดูล Devel โดยป้อน:
$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
จำนวนมากของการดำเนินการให้หน้าจอ BatchAPI เปิดใช้งานหน้าจอผู้ดูแลระบบโหนดที่กำหนดค่าที่ช่วยให้การกรองตามประเภทการเลือกโหนดทั้งหมดที่ตรงกับเกณฑ์การค้นหาของคุณ ฯลฯ
นั่นคือโซลูชันแบบแฮนด์ดาวน์ของฉันใน Drupal 6 - นอกเหนือจากการลบแบบกลุ่มคุณสามารถแก้ไขโหนดจำนวนมากและทำสิ่งอื่น ๆ ได้
ดูเหมือนว่ารุ่น Drupal 7 ยังไม่พร้อม - แต่ฉันจะดูโมดูลนั้นสำหรับการวางจำหน่าย D7
ตัวอย่างอื่นคือ:
$query = db_query("SELECT n.nid FROM {node} n WHERE n.type = 'TO_BE_DELETED'");
while ($n = db_fetch_object($query))
{
node_delete($n->nid);
}
ที่TO_BE_DELETED
เป็นประเภทของเนื้อหาที่จะถูกลบ
db_delete('node')
ด้วยโมดูล Devel โดยใช้ drush:
drush genc 0 --types=article --kill
หรือใน UI ตามที่อธิบายไว้ที่นี่: http://befused.com/drupal/delete-nodes-devel
devel_generate
ที่ต้องเปิดใช้งาน และสำหรับหลายประเภทdrush genc 0 --kill --types="article, page"
หากคุณเปิดใช้งานโมดูลโยกย้ายคุณสามารถใช้:
$ drush migrate-wipe <content-type>
ดูคำสั่งโยกย้ายทั่วไปใช้ Drush
โมดูลนี้ใช้เพื่อลบเนื้อหาและ / หรือผู้ใช้ทั้งหมดจากไซต์ นี่เป็นเครื่องมือสำหรับนักพัฒนาซึ่งส่วนใหญ่มีประโยชน์ในหลายกรณี
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
เพียงไปที่แดชบอร์ด -> เนื้อหาเลือกเนื้อหาทั้งหมด (คุณสามารถกรองตามประเภทเนื้อหา) จากนั้นเลือก "ลบรายการ"