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


31

ฉันมีหลายพันโหนดของประเภทเนื้อหาที่เฉพาะเจาะจง การใช้เว็บอินเตอร์เฟส (example.com/admin/content) ฉันสามารถลบได้ครั้งละประมาณ 50 เท่านั้น ฉันจะลบออกอย่างรวดเร็วได้อย่างไร

คำตอบ:


32

มีโมดูลสำหรับ (TM) นั้น

ดูลบขยะ

ซึ่งจะใช้ Batch API เพื่อลบโหนดเพื่อหลีกเลี่ยงการหมดเวลาหรือปัญหาหน่วยความจำเมื่อลบโหนดนับพันด้วยการเรียก node_delete_multiple () เพียงครั้งเดียว

การลบจำนวนมากเป็นโมดูลที่ถูกทิ้งร้าง ดูทางเลือกอื่น ๆ :


ว้าวฉันพลาดไปเลย หาดี
เกร็ก

4
อีกวิธีหนึ่งที่อาจเป็นประโยชน์หากคุณทำมากกว่าตัวกรองประเภทเนื้อหาอย่างง่ายคือใช้การดำเนินการจำนวนมากของ Views: drupal.org/project/views_bulk_operations
geerlingguy

โมดูลการลบจำนวนมากถูกยกเลิกในขณะนี้ แนะนำให้ใช้การดำเนินการจำนวนมากของ Views
ปรับแต่ง

26

ดูโมดูล 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')));โดยตรง


17

ใน 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);'

นี่จะเป็นการลบบทความทั้งหมดของคุณ


สิ่งนี้ไม่ถูกต้องลบ () คาดว่าเอนทิตีที่โหลดแล้วไม่ใช่ของ ID ซึ่งเป็นสิ่งที่ส่งคืนเคียวรีเอนทิตี แทนที่จะใช้ผลลัพธ์ $ ที่ไม่ได้อธิบายให้ใช้ $ ids หรือ $ nids จากนั้น $ storage-> delete ($ storage-> load ($ ids))
Berdir

@Berdir ขอบคุณฉันจะทดสอบรหัสอีกครั้งบางทีปัญหานี้ได้รับการแนะนำในการแก้ไขครั้งเดียว
Adrian Cid Almaguer

@Berdir ฉันอัปเดตคำตอบและฉันทดสอบรหัสและใช้งานได้ปัญหาได้รับการแนะนำในการแก้ไขครั้งเดียว
Adrian Cid Almaguer

2
@AdrianCidAlmaguer คุณสามารถแทนที่ข้อความค้นหาด้วย$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
4k4

1
เมื่อเร็ว ๆ นี้ใช้สิ่งนี้ในการอัพเดตฮุกมันน่าสังเกตว่าถ้าคุณใช้entityQuery คุณควรตั้งค่าaccessCheckบนคำสั่ง มิฉะนั้นถ้าคุณรันใน drush โดยค่าเริ่มต้น accessCheck ถูกตั้งค่าเป็นจริงและโหนดใด ๆ ที่ uid 0 ไม่มีสิทธิ์เข้าถึงจะไม่ถูกส่งคืน
awm

13

หากคุณต้องการทำผ่าน UI อย่างหมดจดคุณสามารถใช้โมดูล devel_generate

  1. นำทางไปยังเมนู "สร้างเนื้อหา" ใน "การกำหนดค่า" (ผู้ดูแลระบบ / กำหนดค่า / พัฒนา / สร้าง / เนื้อหา)
  2. เลือกประเภทเนื้อหาที่คุณต้องการลบ
  3. ตรวจสอบให้แน่ใจว่าได้ทำเครื่องหมายในช่องถัดจาก "ลบเนื้อหาทั้งหมดในประเภทเนื้อหาเหล่านี้ก่อนสร้างเนื้อหาใหม่"
  4. กำหนดจำนวนโหนดที่คุณต้องการสร้างเป็น "0"

วิธีนี้จะไม่มีการสร้างโหนดและโหนดทั้งหมดของประเภทที่เลือกจะถูกลบ


10

สร้างไฟล์ด้วยโค้ดด้านล่างในรูทของการติดตั้ง 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);
  }
?>

1
db_fetch_object ไม่ได้เป็นส่วนหนึ่งของ API ฐานข้อมูล D7
ya.teck

10

คุณสามารถทำได้ใน 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);
}

1
สิ่งนี้จะดำเนินการช้ามากหากคุณต้องการลบหลายพันโหนดมันจะดีกว่าถ้าใช้วิธีที่ใช้ batch API เช่น VBO
abielefeldt

6

ทำสิ่งนี้ในเทอร์มินัลถ้าคุณใช้ 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

5

จำนวนมากของการดำเนินการให้หน้าจอ BatchAPI เปิดใช้งานหน้าจอผู้ดูแลระบบโหนดที่กำหนดค่าที่ช่วยให้การกรองตามประเภทการเลือกโหนดทั้งหมดที่ตรงกับเกณฑ์การค้นหาของคุณ ฯลฯ

นั่นคือโซลูชันแบบแฮนด์ดาวน์ของฉันใน Drupal 6 - นอกเหนือจากการลบแบบกลุ่มคุณสามารถแก้ไขโหนดจำนวนมากและทำสิ่งอื่น ๆ ได้

ดูเหมือนว่ารุ่น Drupal 7 ยังไม่พร้อม - แต่ฉันจะดูโมดูลนั้นสำหรับการวางจำหน่าย D7


4

ตัวอย่างอื่นคือ:

$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เป็นประเภทของเนื้อหาที่จะถูกลบ


3
ควรสังเกตว่าใช้งานได้กับ Drupal 4.6, 5 และ 6 เท่านั้น รุ่น Drupal 7 คือdb_delete('node')
Greg

4

ด้วยโมดูล Devel โดยใช้ drush:

drush genc 0 --types=article --kill

หรือใน UI ตามที่อธิบายไว้ที่นี่: http://befused.com/drupal/delete-nodes-devel


เป็นโมดูลย่อย Devel devel_generateที่ต้องเปิดใช้งาน และสำหรับหลายประเภทdrush genc 0 --kill --types="article, page"
leymannx

3

ฉันใช้ลบโมดูลทั้งหมดทำงานได้ดีกับ D8 และให้คำสั่ง drush ที่มีประโยชน์มาก ตัวอย่างเช่นหากต้องการลบเนื้อหาทั้งหมดของarticleประเภทเนื้อหา:

drush delete-all article  

ใช้งานกับ D8 ได้หรือไม่ ฉันเปิดใช้งานโมดูล แต่ได้รับไม่พบคำสั่ง drush 'บทความลบทั้งหมด' ฉันยังล้างแคช
drush

1

คุณสามารถลอง ลบโมดูลทั้งหมดไปที่ 'ผู้ดูแลระบบ / เนื้อหา / delete_content' และคุณจะได้รับแบบฟอร์มสำหรับการลบเนื้อหาที่เป็นของเนื้อหาบางประเภท

ความนับถือ



0

โมดูลนี้ใช้เพื่อลบเนื้อหาและ / หรือผู้ใช้ทั้งหมดจากไซต์ นี่เป็นเครื่องมือสำหรับนักพัฒนาซึ่งส่วนใหญ่มีประโยชน์ในหลายกรณี

https://www.drupal.org/project/delete_all

ตามที่จะเป็นโมดูลลบเป็นกลุ่มจะลบโหนดใด ๆ ของโหนดบางชนิดโดยใช้แบทช์ API ขอแนะนำให้ใช้โมดูล Views Batch Operations (VBO) สำหรับโหนดจำนวนน้อย แต่ถ้าคุณต้องลบ 10.000 โหนดโมดูลนี้อาจเป็นตัวเลือกที่ดีกว่า

https://www.drupal.org/project/bulkdelete


0

ลบโหนดทั้งหมดของประเภทเนื้อหาโดยทางโปรแกรมที่นี่คือฟังก์ชั่นตัวช่วย:


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.'));
  }
}


-1

ฉันลงเอยด้วยการใช้db_deleteไม่ต้องใช้โมดูล:

<?php
  db_delete('node')
    ->condition('type', 'MY_CONTENT_TYPE')
    ->execute();
?>

แก้ไข / คำเตือน:ดูความคิดเห็นของ Berdir ด้านล่าง วิธีนี้ไม่ได้ล้างข้อมูลทั้งหมดที่เกี่ยวข้องกับโหนด


3
ปัญหาของวิธีนี้คือโมดูลอื่นไม่สามารถตอบสนองและลบข้อมูลได้เช่นกัน ขึ้นอยู่กับชนิดเนื้อหามีข้อมูลเฉพาะโหนดในตาราง content_type ของโหนดฟิลด์ฟิลด์ taxonomies (ฟิลด์จริงเกินไป) ข้อคิดเห็นและอื่น ๆ ดังนั้นคุณอาจจบลงด้วยข้อมูลเก่า ๆ มากมายในฐานข้อมูลของคุณ
Berdir

@Berdir - น่าสนใจ มีวิธีที่ดีกว่าในการลบโหนดหรือไม่
เกร็ก

3
มี node_delete () และ node_delete_multiple () ดูคำตอบของ tim.plunket แต่ไม่ได้ออกแบบมาเพื่อจัดการกับโหนดนับพันดูapi.drupal.org/api/drupal/modules--node--node.module/function / … . มันโหลดโหนดทั้งหมดแล้ววนซ้ำโหนดเหล่านั้นในการร้องขอเดียว สวยมากต้องใช้โมดูล contrib เช่น bulkdelete ถ้าคุณต้องการลบหลายร้อยหรือหลายพันโหนด
Berdir

-1

หากคุณไม่ต้องการโค้ดคุณสามารถลองใช้โมดูลนี้https://drupal.org/project/total_control

เพียงไปที่แดชบอร์ด -> เนื้อหาเลือกเนื้อหาทั้งหมด (คุณสามารถกรองตามประเภทเนื้อหา) จากนั้นเลือก "ลบรายการ"

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