เพียงแค่สงสัยว่า Drush สามารถลบโหนดของประเภทเนื้อหาที่กำหนดได้หรือไม่
สิ่งที่ต้องการ: $ drush delete-node --type=MyContentType
หากเป็นไปไม่ได้ฉันสามารถสร้างวิธีการเช่นนั้นได้หรือไม่?
เพียงแค่สงสัยว่า Drush สามารถลบโหนดของประเภทเนื้อหาที่กำหนดได้หรือไม่
สิ่งที่ต้องการ: $ drush delete-node --type=MyContentType
หากเป็นไปไม่ได้ฉันสามารถสร้างวิธีการเช่นนั้นได้หรือไม่?
คำตอบ:
คุณสามารถสร้างฟังก์ชั่นดังนี้:
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
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 คุณสามารถดูโมดูลลบทั้งหมดที่สนับสนุน:
Drush ลบทั้งหมด ตัวอย่าง: บทความ drush delete-all Drush บน Drupal 7 เวอร์ชั่น ลบโหนดทั้งหมดโหนดของประเภทเนื้อหาที่เฉพาะเจาะจงหรือผู้ใช้ ตัวอย่าง: drush delete-all article เลือกโหนดบทความทั้งหมด drush delete-all ทั้งหมดโหนดลบทุกประเภท drush delete-all - รีเซ็ตลบโหนดทุกประเภทและรีเซ็ตโหนดแก้ไขใหม่และแสดงความคิดเห็นเคาน์เตอร์ drush ผู้ใช้ลบทั้งหมดลบผู้ใช้ ตัวเลือก: - รีเซ็ตตัวนับรีเซ็ตสำหรับโหนดการแก้ไขและตารางแสดงความคิดเห็น - บทบาทเลือกบทบาท นามแฝง: ดา
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
การใช้งาน:
:~# 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
ลองใช้หนึ่งซับต่อไปนี้ซึ่งจะลบโหนด MyContentType ทั้งหมดออกจาก Drupal:
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);
ในการลบโหนดทั้งหมดของเนื้อหาบางประเภทคุณอาจลองเรียกใช้คำสั่งต่อไปนี้ผ่าน drush:
drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'
โดยที่ MyContentType เป็นชื่อประเภทเนื้อหาของเครื่อง (เช่นหน้า)
สำหรับแต่ละโหนด:
$ drush php-eval 'node_delete($node->nid);'
drush php-eval
ประเมินโค้ด PHP โดยพลการหลังจาก bootstrapping Drupal
อัปเดตคำตอบที่ให้บริการโดย @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
เพื่อลบโหนดที่เฉพาะเจาะจง แต่ถ้าคุณต้องการลบโหนดทั้งหมดตามประเภทเนื้อหาฉันเดาว่าคุณสามารถสร้างปลั๊กอิน drush โดยใช้ batch api
คุณสามารถทำได้ด้วยโมดูล devel ตามที่ตอบที่ฉันจะลบโหนดของประเภทเนื้อหาที่กำหนดด้วย Drush ได้หรือไม่
ติดตั้งโมดูล devel และใช้ drush เพื่อลบโหนดทั้งหมด
$ drush genc - ฆ่า 0 0
คุณยังสามารถให้ตัวเลือกประเภท
$ drush genc --kill --types = บทความ 0 0