Bisakah saya menghapus node dari jenis konten yang diberikan dengan Drush?

13

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?

chefnelone
sumber

Jawaban:

4

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 SELECTkueri 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).

Chapabu
sumber
Begitu ya, sepertinya tautan repositori menunjukkan cara menambahkan metode drush dengan benar.
chefnelone
Ya! Readme memiliki beberapa cara berbeda untuk mengimplementasikannya juga!
Chapabu
21

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
ericj
sumber
Pintar, saya suka itu.
m4olivei
3
Ini bekerja dengan D8. The devel_generatemodul 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.
William Turrell
15

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

ninjascorner
sumber
Saya bermaksud menghapus semua node berdasarkan tipe konten.
chefnelone
Apakah Anda mencoba modul ini drupal.org/project/delete_all Usage Drush drush delete-all Contoh: drush delete-all article
ninjascorner
di mana saya dapat menemukan perintah <nid> drush node_delete?
Adrian Cid Almaguer
Untuk menghemat waktu orang, hingga Desember 2016, delete_all belum porting ke Drupal 8 , tetapi jawaban genc berfungsi.
William Turrell
5

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 Annoucementsdigunakan EntityFieldQuery(). Kemudian mendapat semua $nidsdari 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.

mpdonadio
sumber
5

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

Drush 9

drush entity:delete node --bundle=my_content_type

Denis Viunyk
sumber
2
Jawaban terbaik saat ini!
Jonathan
4

VBO memiliki integrasi Drush. Buat tampilan VBO node, jalankan melalui Drush (menggunakan drush vbo-execute), melewati jenis node sebagai argumen.

Bojan Zivanovic
sumber
Saya pikir inilah yang saya butuhkan. Hanya 2 pertanyaan: Yang merupakan metode drush untuk menjalankan tampilan? dan apakah metode ini lebih cepat daripada mengeksekusi tampilan di browser?
chefnelone
Mengedit jawaban untuk menentukan perintah drush yang tepat. Dan ya, itu akan lebih cepat karena cara ini tampilan tidak diberikan.
Bojan Zivanovic
1

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.

Mauro Mascia
sumber
Kenapa kondisinya 'nid' > 5000?
Елин Й.
itu contoh, seperti tipenya.
Mauro Mascia
Tetapi poster asli tidak menyebutkan tentang kondisi seperti itu, itu sebabnya saya pikir contohnya tidak relevan, sehingga menyesatkan.
Елин Й.
1

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: nodeadalah 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);
kenorb
sumber
1

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

kenorb
sumber
1

Untuk masing-masing node:

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

drush php-eval
Mengevaluasi kode php sewenang-wenang setelah bootstrap Drupal

edmitry
sumber
Harap tambahkan beberapa detail lagi untuk menjelaskan kode Anda, tanpanya ini dapat dianggap sebagai jawaban berkualitas rendah (dan karenanya dapat dihapus melalui moderasi).
Pierre.Vriens
1

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);'
Jason Yarrington
sumber
drush ev '$ type =' \ '' node '\' '; entity_delete_multiple ($ type, \ Drupal :: entityQuery ($ type) -> execute ()); '
geek-merlin
Untuk memperbarui jawaban yang ada, silakan berikan komentar untuk menyarankan suntingan.
leymannx
0

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.

user8012
sumber
Saya tidak dapat menemukan perintah NID node_delete drush.
Adrian Cid Almaguer