Hanya ingin tahu apakah Drush mampu menghapus node dari tipe konten yang diberikan.
Sesuatu seperti: $ drush delete-node --type=MyContentType
Jika tidak memungkinkan, dapatkah saya membuat metode seperti itu?
Hanya ingin tahu apakah Drush mampu menghapus node dari tipe konten yang diberikan.
Sesuatu seperti: $ drush delete-node --type=MyContentType
Jika tidak memungkinkan, dapatkah saya membuat metode seperti itu?
Jawaban:
Anda dapat membuat fungsi seperti berikut:
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);
}
}
Catatan - Anda juga bisa menggunakan SELECT
kueri sederhana , tetapi karena Anda bekerja dengan entitas, tampaknya lebih masuk akal / praktik umum untuk menggunakan EntityFieldQuery .
Ini juga harus cukup mudah untuk mengubah atau menambah argumen. Anda juga bisa memasukkannya ke perintah Drush dengan mudah - ada contoh cara melakukannya di repositori Drush (periksa bagian Perintah di dekat bagian bawah).
Instal modul devel, dan gunakan drush untuk menghapus semua node,
$ drush genc --kill 0 0
Anda juga dapat memberikan opsi jenis,
$ drush genc --kill --types=article 0 0
devel_generate
modul disertakan dengan devel, tetapi yang perlu diaktifkan dengan drush en devel_generate
Genc biasanya digunakan untuk membuat node, sehingga 0 0 di akhir memberitahu tidak untuk membuat sesuatu yang baru, dan --kill untuk menghapus apa yang sudah ada.
Saya kira Anda bisa dengan menggunakan perintah di bawah ini
drush node_delete <nid>
EDIT: Menemukan modul yang melakukan sesuatu / terkait dengan pertanyaan
http://drupal.org/project/delete_all
Pemakaian
Drush
drush delete-all
Contoh: drush delete-all article
delete_all
belum porting ke Drupal 8 , tetapi jawaban genc berfungsi.
Sesuatu seperti ini akan bekerja (belum diuji):
$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node', '=')
->entityCondition('bundle', 'Announcements')
->execute();
$nids = array_keys($entities['node']);
node_delete_multiple($nids);
Ini akan menemukan semua node dengan tipe konten yang Annoucements
digunakan EntityFieldQuery()
. Kemudian mendapat semua $nids
dari hasil, dan menghapusnya menggunakan node_delete_multiple()
.
Anda dapat mengambil kode ini, memasukkannya ke dalam file PHP yang terpisah, dan kemudian menjalankannya dengan drush scr
.
Menggunakan API akan memastikan bahwa semua kait yang tepat menyala. Di antara hal-hal lain, mereka juga akan menghapus revisi simpul dan data lapangan (dan revisi mereka) sehingga Anda tidak memiliki data yatim di database.
Ada beberapa ide bagus di utas ini. Jika Anda benar-benar tidak ingin melakukan pemrograman dan ingin menggunakan Drush, Anda dapat melihat pada modul Delete All berkontribusi:
Drush hapus drush-all Contoh: drush delete-all article Drush pada versi Drupal 7 Hapus semua node, node dari tipe konten tertentu atau pengguna. Contoh: drush delete-all article Hapus semua node artikel. drush delete-all all Hapus semua jenis node. drush delete-all --reset Hapus semua jenis node, dan setel ulang simpul, revisi, dan penghitung komentar. drush delete-all users Hapus pengguna. Pilihan: --Reset Reset penghitung untuk node, revisi dan tabel komentar. --roles memilih peran Alias: da
VBO memiliki integrasi Drush. Buat tampilan VBO node, jalankan melalui Drush (menggunakan drush vbo-execute
), melewati jenis node sebagai argumen.
Anda juga dapat membuat skrip drush (katakanlah itu disebut "bulk_delete.php" dan ditempatkan di bawah folder root Drupal):
#!/usr/bin/env drush
$res = db_delete('node')
->condition('type', 'mycontenttype', '=')
->execute();
echo "deleted:" . $res;
Ini benar-benar cara tercepat untuk melakukannya: permintaan langsung ke db, menggunakan fungsi Drupal's db_delete
Pemakaian:
:~# cd /var/www/www.mysite.com
:~# drush --uri=www.mysite.com scr bulk_delete.php
Dokter: https://api.drupal.org/api/drupal/includes!database!database.inc/function/db_delete/7
Peringatan: proses ini tidak menghapus data bidangnya. Bagaimanapun proses yang sama dapat diterapkan ke bidang-bidang ini (melihat kolom "bundel" dari masing-masing bidang). Sebagai contoh:
#!/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";
}
Di mana "mycontenttype" adalah yang digunakan dalam permintaan pertama.
'nid' > 5000
?
Drupal 7
Coba satu-liner berikut, ini menghapus semua node MyContentType dari Drupal:
drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'
Atau Anda dapat menghapus semua entitas berdasarkan nama tipe entitas (mis. Simpul):
drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->execute(); entity_delete_multiple("node", array_keys(reset($res)));'
Catatan: node
adalah nama jenis entitas Anda, Anda dapat mengubahnya jika diperlukan.
Jika Anda mendapatkan memori atau kesalahan waktu habis, Anda dapat menambahkan set berikut sebelum $res
:
ini_set('memory_limit', -1); ini_set('max_execution_time', 0);
Untuk menghapus semua node dari jenis konten tertentu, Anda dapat mencoba menjalankan perintah berikut melalui drush:
drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'
Di mana MyContentType adalah nama Jenis Konten mesin Anda (misalnya Halaman).
Untuk masing-masing node:
$ drush php-eval 'node_delete($node->nid);'
drush php-eval
Mengevaluasi kode php sewenang-wenang setelah bootstrap Drupal
Memperbarui jawaban yang diberikan oleh @kenorb.
Di Drupal 8
drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'
Kamu bisa memakai
drush node_delete NID
untuk menghapus node tertentu, tetapi jika Anda ingin menghapus semua node berdasarkan tipe konten saya kira Anda dapat membuat plugin drush menggunakan batch api.
Anda juga dapat melakukan ini dengan modul devel seperti dijawab di Dapatkah saya menghapus node dari jenis konten yang diberikan dengan Drush?
Instal modul devel, dan gunakan drush untuk menghapus semua node,
$ drush genc --kill 0 0
Anda juga dapat memberikan opsi jenis,
$ drush genc --kill --types = artikel 0 0