Bagaimana cara menghapus semua node dari jenis konten yang diberikan?

31

Saya memiliki beberapa ribu node dari jenis konten tertentu. Menggunakan antarmuka web (example.com/admin/content), saya hanya dapat menghapus sekitar 50 sekaligus. Bagaimana saya bisa menghapusnya dengan cepat?

Greg
sumber

Jawaban:

32

Ada modul untuk itu (TM).

Lihat Penghapusan Massal .

Itu akan menggunakan Batch API untuk menghapus node untuk menghindari masalah timeout atau memori ketika menghapus ribuan node dengan satu panggilan ke node_delete_multiple ().

Hapus Massal adalah modul yang ditinggalkan. Lihat alternatifnya:

Berdir
sumber
Wow, saya benar-benar merindukan yang ini. Bagus temukan.
Greg
4
Salah satu metode lain, yang bisa berguna jika Anda melakukan lebih dari filter tipe konten sederhana, adalah dengan menggunakan Operasi Massal Views: drupal.org/project/views_bulk_operations
geerlingguy
Modul Penghapusan Massal ditinggalkan sekarang. Disarankan ada untuk menggunakan Operasi Massal Views.
Refineo
26

Melihat modul Devel Generate untuk mendapatkan inspirasi, inilah fungsinya "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))));
  }
}

Jadi saya akan mencoba menggunakan Devel Generate untuk menghapus semua node tetapi tidak membuat yang baru, atau menggunakan example.com/devel/php untuk menelepon devel_generate_content_kill(array('node_types' => array('my_node_type')));langsung.

tim.plunkett
sumber
17

Dalam Drupal 8 salah satu caranya adalah menggunakan metode entityQuery () dengan metode 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);

Jika Anda perlu menerapkan filter / ketentuan lain, Anda dapat memeriksa halaman antarmuka QueryInterface

EDIT (Cara lain, terima kasih kepada @ 4k4 ):

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadByProperties(["type" => "YOUR_CONTENT_TYPE_NAME"]);
$storage_handler->delete($entities);

Jika Anda ingin menguji kode, Anda dapat menggunakan:

drush php-eval '$storage_handler = \Drupal::entityTypeManager()->getStorage("node"); $entities = $storage_handler->loadByProperties(["type" => "article"]); $storage_handler->delete($entities);'

Ini akan menghapus semua artikel Anda.

Adrian Cid Almaguer
sumber
Ini tidak benar, delete () mengharapkan entitas yang dimuat, bukan ID, yang merupakan entitas yang mengembalikan kueri. Alih-alih $ hasil non-deskriptif, gunakan $ id atau $ id dan kemudian $ storage-> delete ($ storage-> load ($ id)).
Berdir
@Berdir terima kasih, saya akan menguji kode lagi, mungkin masalah ini diperkenalkan dalam satu pengeditan
Adrian Cid Almaguer
@Berdir Saya memperbarui jawabannya dan saya menguji kodenya dan berhasil, masalahnya diperkenalkan dalam satu edit.
Adrian Cid Almaguer
2
@AdrianCidAlmaguer, Anda bisa mengganti kueri dengan$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
4k4
1
Baru-baru ini menggunakan ini dalam kait pembaruan, perlu dicatat bahwa jika Anda menggunakan entityQuery Anda harus mengatur accessCheckpada pernyataan. Kalau tidak, jika Anda menjalankannya dalam drush, secara default accessCheck diatur ke true dan setiap node yang tidak memiliki akses ke 0 tidak akan dikembalikan.
awm
13

Jika Anda ingin melakukannya murni melalui UI, Anda dapat menggunakan modul devel_generate.

  1. Arahkan ke menu "Hasilkan Konten" di "Konfigurasi" (admin / config / pengembangan / hasilkan / konten).
  2. Pilih jenis konten yang ingin Anda hapus.
  3. Pastikan kotak centang di sebelah "Hapus semua konten dalam jenis konten ini sebelum menghasilkan konten baru" dicentang.
  4. Tetapkan jumlah node yang ingin Anda hasilkan menjadi "0".

Dengan cara ini, tidak ada node yang akan dihasilkan dan semua node dari tipe yang dipilih akan dihapus.

areynolds
sumber
10

Buat file dengan kode di bawah ini di root instalasi drupal dan jalankan file.

<?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);
  }
?>
Satya
sumber
1
db_fetch_object bukan bagian dari basis data D7.
ya.teck
10

Anda dapat melakukannya di Drupal 7 menggunakan bagian Execute PHP Code dari modul Devel dengan memasukkan:

$result= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'TYPE'");
foreach ($result as $record) {
  node_delete($record->nid);
}
Colin Shipton
sumber
1
Ini akan berjalan sangat lambat, jika Anda perlu menghapus ribuan node, lebih baik menggunakan metode yang menggunakan API batch seperti VBO.
abielefeldt
6

Lakukan ini di terminal, jika Anda menggunakan Drush dan hapus semua modul:

 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
semak
sumber
5

Operasi Tampilan Massal menyediakan layar admin BatchAPI yang diaktifkan dan dapat dikonfigurasi yang memungkinkan pemfilteran menurut jenis, pemilihan semua node yang cocok dengan kriteria pencarian Anda, dll.

Itu solusi mudah saya di Drupal 6 - selain menghapus batch, Anda dapat mengedit secara massal node dan melakukan banyak hal lainnya.

Sepertinya versi Drupal 7 belum siap - tapi saya akan menonton modul untuk rilis D7.

Darren Petersen
sumber
4

Cuplikan lainnya adalah:

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

di mana TO_BE_DELETEDjenis konten yang akan dihapus.

Tangurena
sumber
3
Perlu dicatat bahwa hanya berfungsi untuk Drupal 4.6, 5, dan 6. Versi Drupal 7 adalahdb_delete('node')
Greg
4

Dengan modul Devel, gunakan drush:

drush genc 0 --types=article --kill

Atau di UI seperti yang dijelaskan di sini: http://befused.com/drupal/delete-nodes-devel

sunzu
sumber
Sub-modul Devel devel_generateyang perlu diaktifkan. Dan untuk banyak tipedrush genc 0 --kill --types="article, page"
leymannx
3

Saya menggunakan Delete all module, berfungsi baik dengan D8 dan memberikan perintah drush yang sangat berguna. Misalnya, untuk menghapus semua konten dari articlejenis konten:

drush delete-all article  
gerzenstl
sumber
Apakah ini bekerja dengan D8? Saya mengaktifkan modul tetapi saya mendapatkan Perintah drush 'delete-all article' tidak dapat ditemukan. Saya juga membersihkan cache drush
Yassin Tahtah
1

Anda dapat mencoba Hapus semua modul, navigasikan ke 'admin / konten / delete_content' dan Anda akan diberikan formulir untuk menghapus konten milik jenis konten tertentu.

Salam

OV
sumber
0

Modul ini digunakan untuk menghapus semua konten dan / atau pengguna dari suatu situs. Ini terutama alat pengembang, yang dapat berguna dalam beberapa kasus

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

seperti akan sebagai modul Hapus Massal akan menghapus node dari tipe-simpul tertentu menggunakan api batch. Disarankan untuk menggunakan modul Views Batch Operations (VBO) untuk sejumlah kecil node. Tetapi jika Anda harus menghapus 10.000 node modul ini mungkin merupakan opsi yang lebih baik.

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

onlink
sumber
0

Hapus semua node tipe konten secara terprogram di sini adalah fungsi pembantu:


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

berramou
sumber
-1

Saya akhirnya menggunakan db_delete , tidak perlu modul:

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

Sunting / Peringatan: Lihat komentar Berdir di bawah ini. Metode ini tidak membersihkan semua data yang terkait dengan node.

Greg
sumber
3
Masalah dengan pendekatan ini adalah bahwa modul lain tidak dapat bereaksi dan menghapus informasinya juga. Bergantung pada tipe konten, ada informasi spesifik node dalam tabel content_type node itu, bidang, taksonomi (bidang juga, sebenarnya), komentar dan sebagainya. Jadi Anda mungkin berakhir dengan banyak informasi basi di database Anda.
Berdir
@Berdir - Menarik. Apakah ada cara built-in yang lebih baik untuk menghapus node?
Greg
3
Ada node_delete () dan node_delete_multiple (), lihat jawaban tim.plunket, tetapi itu tidak dirancang untuk menangani ribuan node, lihat api.drupal.org/api/drupal/modules--node--node.module/function / ... . Ini memuat semua node dan kemudian mengulanginya dalam satu permintaan. Jadi cukup banyak harus menggunakan modul contrib seperti bulkdelete jika Anda ingin menghapus ratusan atau ribuan node.
Berdir
-1

Jika Anda tidak ingin cod, Anda dapat mencoba modul ini, https://drupal.org/project/total_control

Cukup buka Dasbor -> Konten, pilih semua konten (Anda dapat memfilter menurut jenis konten), lalu pilih "Hapus item"

pengguna9869932
sumber