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?

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


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

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


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.


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


4

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


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.


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

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


1

Untuk masing-masing node:

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

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


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

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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.