Drush ile belirli bir içerik türünün düğümlerini silebilir miyim?


13

Drush'un belirli bir içerik türündeki düğümleri silip silemeyeceğini merak etmek.

Gibi bir şey: $ drush delete-node --type=MyContentType

Mümkünse böyle bir yöntem oluşturabilir miyim ?

Yanıtlar:


4

Aşağıdaki gibi bir işlev oluşturabilirsiniz:

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

Not - Basit bir SELECTsorgu da kullanabilirsiniz , ancak varlıklarla çalışırken EntityFieldQuery kullanmak daha mantıklı / yaygın bir uygulama gibi görünür .

Bunu değiştirmek veya argüman eklemek oldukça kolay olmalıdır. Ayrıca bir Drush komutuna da kolayca koyabilirsiniz - bunun Drush deposunda nasıl yapılacağına dair bir örnek var (alt kısımdaki Komutlar bölümünü kontrol edin).


Depo bağlantısının bir drush yönteminin nasıl düzgün bir şekilde ekleneceğini gösteriyor gibi görünüyor.
chefnelone

Evet! Benioku dosyasının bunları uygulayabileceğiniz bazı farklı yolları vardır!
Chapabu

21

Devel modülünü takın ve tüm düğümleri silmek için drush kullanın,

$  drush genc --kill 0 0 

Ayrıca bir yazı seçeneği de sunabilirsiniz,

$  drush genc --kill --types=article 0 0

Zeki, hoşuma gitti.
m4olivei

3
Bu D8 ile çalışır. devel_generateModül devel ile birlikte, ihtiyaçlar ile etkin olması drush en devel_generate genc normalde için kullanılır oluşturmak sonunda 0 0 zaten orada ne kaldırmak için yeni bir şey yaratmak değil onu söylüyorum ve --kill bu yüzden, düğümleri.
William Turrell

15

Aşağıdaki komutu kullanarak yapabilirsiniz sanırım

drush node_delete <nid>

EDIT: bir şey yapan / soru ile ilgili bir modül bulundu

http://drupal.org/project/delete_all

kullanım

Drush

drush delete-all

Misal: drush delete-all article


İçerik türüne göre tüm düğümleri silmek istedim.
chefnelone

Bu modülü denediniz mi drupal.org/project/delete_all Kullanım Drush drush delete-all Örnek: drush delete-all article
ninjascorner

drush node_delete <nid> komutunu nerede bulabilirim?
Adrian Cid Almaguer

Aralık 2016 itibariyle insanlara zaman kazandırmak delete_all için henüz Drupal 8'e taşınmadı , ancak genc cevabı işe yarıyor.
William Turrell


5

Böyle bir şey işe yarayacak (denenmemiş):

$query = new EntityFieldQuery();

$entities = $query->entityCondition('entity_type', 'node', '=')
  ->entityCondition('bundle', 'Announcements')
  ->execute();

$nids = array_keys($entities['node']);

node_delete_multiple($nids);

Bu, içerik türüne sahip tüm düğümleri Annoucementskullanarak bulur EntityFieldQuery(). Daha sonra tüm $nidssonuçtan alır ve kullanarak silinir node_delete_multiple().

Bu kodu alabilir, ayrı bir PHP dosyasına koyabilir ve sonra ile çalıştırabilirsiniz drush scr.

API'yi kullanmak, tüm uygun kancaların ateşlenmesini sağlayacaktır. Diğer şeylerin yanı sıra, düğüm revizyonlarını ve alan verilerini (ve onların revizyonlarını) da silerler, böylece veritabanında artık veriler bulunmaz.


5

Bu konuda bazı iyi fikirler var. Gerçekten herhangi bir programlama yapmak istemiyorsanız ve Drush'ı kullanmak istiyorsanız, Katkıda bulunan Tümünü Sil modülüne bakabilirsiniz :

Drush
hepsini sil
Örnek: drush-all-article

Drupal 7 versiyonunda drush

Tüm düğümleri, belirli bir içerik türündeki düğümleri veya kullanıcıları silin.

Örnekler:
 drush delete-all article Tüm makale düğümlerini silin.
 drush-all all Her türden düğümü sil.
 drush delete-all --reset Her türden düğümü siler ve düğüm, düzeltme ve yorum sayaçlarını sıfırlar.
 drush delete-all users Kullanıcıları silin.

Seçenekler:
 --reset Düğüm, revizyon ve yorum tabloları için sayacı sıfırla.
 - roller rolleri seçer

Takma adlar: da

4

VBO'nun Drush entegrasyonu vardır. Düğümlerin VBO görünümünü oluşturun, Drush (kullanarak drush vbo-execute) ile çalıştırın , düğüm türünü bağımsız değişken olarak geçirin .


Sadece 2 soru: Bir görünümü yürütmek için drush yöntemi hangisi? ve Bu yöntem tarayıcıda görünümü yürütmekten daha hızlı mı olacak?
chefnelone

Tam drush komutunu belirtmek için cevabı düzenledi. Ve evet, daha hızlı olacak çünkü görünüm bu şekilde oluşturulmuyor.
Bojan Zivanovic

1

Ayrıca bir drush betiği de oluşturabilirsiniz (diyelim ki "bulk_delete.php" denir ve Drupal kök klasörünün altına yerleştirilir):

#!/usr/bin/env drush

$res = db_delete('node')
  ->condition('type', 'mycontenttype', '=')
  ->execute();

echo "deleted:" . $res;

Bu kesinlikle bunu yapmanın en hızlı yoludur: Drupal işlevini kullanarak db_delete kullanarak db'ye doğrudan sorgulama

Kullanımı:

:~# cd /var/www/www.mysite.com
:~# drush --uri=www.mysite.com scr bulk_delete.php 

Doküman: https://api.drupal.org/api/drupal/includes!database!database.inc/function/db_delete/7

Uyarı: Bu işlem alanlarındaki verileri silmez. Her neyse, aynı işlem bu alanlara uygulanabilir (her alanın "paket" sütununa bakarak). Örneğin:

#!/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";
}

Burada "mycontenttype" ilk sorguda kullanılan koddur.


Neden durum 'nid' > 5000?
Елин Й.

tür gibi bir örnek.
Mauro Mascia

Ancak orijinal poster böyle bir durumdan bahsetmiyor, bu yüzden örneğin alakasız olduğunu, dolayısıyla yanıltıcı olduğunu düşünüyorum.
Елин Й.

1

Drupal 7

Aşağıdaki tek astarı deneyin, tüm MyContentType düğümlerini Drupal'dan kaldırır:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

Veya varlık türü adına (ör. Düğüm) dayalı olarak tüm varlıkları kaldırabilirsiniz:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

Not: nodeVarlık türü adınızdır, gerekirse değiştirebilirsiniz.


Bellek veya zaman aşımı hataları alırsanız, aşağıdaki kümeleri hemen öncesine ekleyebilirsiniz $res:

ini_set('memory_limit', -1); ini_set('max_execution_time', 0);

1

Belirli bir içerik türündeki tüm düğümleri silmek için, drush ile aşağıdaki komutu çalıştırmayı deneyebilirsiniz:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

Burada MyContentType makinenizin İçerik Türü adıdır (örneğin Sayfa).


1

Tek tek düğümler için:

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

drush php-eval
Önyükleme sonrasında rastgele php kodunu değerlendirin Drupal


Lütfen kodunuzu açıklamak için biraz daha ayrıntı ekleyin, ancak bu düşük kaliteli bir cevap olarak değerlendirilebilir (ve dolayısıyla denetlenerek silinebilir).
Pierre.Vriens

1

@Kenorb tarafından sağlanan cevap güncelleniyor.

Drupal 8'de

drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'

drush ev '$ type =' \ '' düğüm '\' '; entity_delete_multiple ($ type, \ Drupal :: entityQuery ($ type) -> execute ()); '
geek-merlin

Mevcut bir yanıtı güncellemek için lütfen düzenleme önermek üzere bir yorum bırakın.
leymannx

0

Kullanabilirsiniz

drush node_delete NID Belirli bir düğümü silmek için, ancak içerik türüne göre tüm düğümleri silmek istiyorsanız, toplu api kullanarak bir drush eklentisi oluşturabileceğinizi tahmin ediyorum.


Drush node_delete NID komutunu bulamıyorum.
Adrian Cid Almaguer

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.