ฉันสามารถลบโหนดของประเภทเนื้อหาที่กำหนดด้วย Drush ได้หรือไม่


13

เพียงแค่สงสัยว่า Drush สามารถลบโหนดของประเภทเนื้อหาที่กำหนดได้หรือไม่

สิ่งที่ต้องการ: $ drush delete-node --type=MyContentType

หากเป็นไปไม่ได้ฉันสามารถสร้างวิธีการเช่นนั้นได้หรือไม่?

คำตอบ:


4

คุณสามารถสร้างฟังก์ชั่นดังนี้:

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 (ทำเครื่องหมายที่ส่วนคำสั่งใกล้ด้านล่าง)


ฉันเห็นมันฟังดูเหมือนลิงก์ที่เก็บแสดงวิธีการเพิ่มวิธีการ drush
chefnelone

ได้! readme มีวิธีการต่าง ๆ ที่คุณสามารถนำไปใช้ได้!
Chapabu

21

ติดตั้งโมดูล devel และใช้ drush เพื่อลบโหนดทั้งหมด

$  drush genc --kill 0 0 

คุณยังสามารถให้ตัวเลือกประเภท

$  drush genc --kill --types=article 0 0

ฉลาดฉันชอบมัน
m4olivei

3
ใช้งานได้กับ D8 devel_generateโมดูลพร้อมกับ devel แต่จะต้องเปิดใช้งานกับdrush en devel_generate Genc โดยปกติจะใช้สร้างโหนดดังนั้น 0 0 ในตอนท้ายจะบอกว่ามันจะไม่สร้างสิ่งใหม่และ --kill ที่จะเอาสิ่งที่มีอยู่แล้ว
William Turrell

15

ฉันเดาว่าคุณทำได้โดยใช้คำสั่งด้านล่าง

drush node_delete <nid>

แก้ไข: พบโมดูลที่ทำบางสิ่ง / เกี่ยวข้องกับคำถาม

http://drupal.org/project/delete_all

การใช้

Drush

drush delete-all

ตัวอย่าง: drush delete-all article


ฉันหมายถึงการลบโหนดทั้งหมดตามประเภทเนื้อหา
chefnelone

คุณลองใช้โมดูลนี้drupal.org/project/delete_all การใช้งาน Drush drush delete-all ตัวอย่าง: drush delete-all article
ninjascorner

ฉันจะหาคำสั่ง drush node_delete <nid> ได้ที่ไหน
Adrian Cid Almaguer

เพื่อเป็นการประหยัดเวลาของผู้คนในเดือนธันวาคม 2559 delete_all ยังไม่ได้รับการย้ายไปยัง Drupal 8แต่คำตอบของ genc ใช้งานได้
William Turrell


5

สิ่งนี้จะใช้ได้ (ยังไม่ทดลอง):

$query = new EntityFieldQuery();

$entities = $query->entityCondition('entity_type', 'node', '=')
  ->entityCondition('bundle', 'Announcements')
  ->execute();

$nids = array_keys($entities['node']);

node_delete_multiple($nids);

นี้จะได้พบกับทุกโหนดที่มีประเภทเนื้อหาโดยใช้Annoucements EntityFieldQuery()จากนั้นจะได้รับทั้งหมดจากผลและลบพวกเขาโดยใช้$nidsnode_delete_multiple()

คุณสามารถใช้รหัสนี้ใส่ไว้ในไฟล์ PHP drush scrที่แยกต่างหากและจากนั้นดำเนินการด้วย

การใช้ API จะช่วยให้มั่นใจว่าตะขอไฟทั้งหมดนั้นเหมาะสม เหนือสิ่งอื่นใดพวกเขาจะลบการแก้ไขโหนดและข้อมูลภาคสนาม (และการแก้ไข) เพื่อให้คุณไม่มีข้อมูลที่ถูกโยงถึงในฐานข้อมูล


5

มีความคิดที่ดีในหัวข้อนี้ หากคุณไม่ต้องการทำการเขียนโปรแกรมจริงๆและต้องการใช้ Drush คุณสามารถดูโมดูลลบทั้งหมดที่สนับสนุน:

Drush
ลบทั้งหมด
ตัวอย่าง: บทความ drush delete-all

Drush บน Drupal 7 เวอร์ชั่น

ลบโหนดทั้งหมดโหนดของประเภทเนื้อหาที่เฉพาะเจาะจงหรือผู้ใช้

ตัวอย่าง:
 drush delete-all article เลือกโหนดบทความทั้งหมด
 drush delete-all ทั้งหมดโหนดลบทุกประเภท
 drush delete-all - รีเซ็ตลบโหนดทุกประเภทและรีเซ็ตโหนดแก้ไขใหม่และแสดงความคิดเห็นเคาน์เตอร์
 drush ผู้ใช้ลบทั้งหมดลบผู้ใช้

ตัวเลือก:
 - รีเซ็ตตัวนับรีเซ็ตสำหรับโหนดการแก้ไขและตารางแสดงความคิดเห็น
 - บทบาทเลือกบทบาท

นามแฝง: ดา

4

VBO มีการบูรณาการ Drush สร้างมุมมอง VBO ของโหนดดำเนินการผ่าน Drush (โดยใช้drush vbo-execute) ส่งผ่านชนิดโหนดเป็นอาร์กิวเมนต์


ฉันคิดว่านี่คือสิ่งที่ฉันต้องการเพียงแค่ 2 คำถาม: วิธีใดที่ใช้ในการรันมุมมอง และวิธีนี้จะเร็วกว่าการใช้มุมมองในเบราว์เซอร์หรือไม่?
chefnelone

แก้ไขคำตอบเพื่อระบุคำสั่ง drush ที่แน่นอน และใช่มันจะเร็วขึ้นเพราะวิธีนี้ไม่ได้แสดงผลมุมมอง
Bojan Zivanovic

1

นอกจากนี้คุณยังสามารถสร้างสคริปต์ 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?
ЕлинЙ

มันเป็นตัวอย่างเช่นประเภท
Mauro Mascia

แต่โปสเตอร์ดั้งเดิมไม่ได้กล่าวถึงสภาพเช่นนี้นั่นเป็นเหตุผลที่ฉันคิดว่าตัวอย่างไม่เกี่ยวข้องดังนั้นจึงทำให้เข้าใจผิด
ЕлинЙ

1

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);

1

ในการลบโหนดทั้งหมดของเนื้อหาบางประเภทคุณอาจลองเรียกใช้คำสั่งต่อไปนี้ผ่าน drush:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

โดยที่ MyContentType เป็นชื่อประเภทเนื้อหาของเครื่อง (เช่นหน้า)


1

สำหรับแต่ละโหนด:

$ drush php-eval 'node_delete($node->nid);'

drush php-eval
ประเมินโค้ด PHP โดยพลการหลังจาก bootstrapping Drupal


โปรดเพิ่มรายละเอียดเพิ่มเติมเพื่ออธิบายรหัสของคุณโดยที่นี่อาจเป็นคำตอบที่มีคุณภาพต่ำ (และอาจถูกลบผ่านการกลั่นกรอง)
Pierre.Vriens

1

อัปเดตคำตอบที่ให้บริการโดย @kenorb

ใน Drupal 8

drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'

drush ev '$ type =' \ '' node '\' '; entity_delete_multiple ($ type, \ Drupal :: entityQuery ($ type) -> execute ()); '
geek-merlin

หากต้องการอัปเดตคำตอบที่มีอยู่โปรดส่งความคิดเห็นเพื่อแนะนำการแก้ไข
leymannx

0

คุณสามารถใช้ได้

drush node_delete NID เพื่อลบโหนดที่เฉพาะเจาะจง แต่ถ้าคุณต้องการลบโหนดทั้งหมดตามประเภทเนื้อหาฉันเดาว่าคุณสามารถสร้างปลั๊กอิน drush โดยใช้ batch api


ฉันไม่พบคำสั่ง drush node_delete NID
Adrian Cid Almaguer

0

คุณสามารถทำได้ด้วยโมดูล devel ตามที่ตอบที่ฉันจะลบโหนดของประเภทเนื้อหาที่กำหนดด้วย Drush ได้หรือไม่

ติดตั้งโมดูล devel และใช้ drush เพื่อลบโหนดทั้งหมด

$ drush genc - ฆ่า 0 0

คุณยังสามารถให้ตัวเลือกประเภท

$ drush genc --kill --types = บทความ 0 0

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.