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 ?
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:
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 SELECT
sorgu 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).
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
devel_generate
Modü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.
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
delete_all
için henüz Drupal 8'e taşınmadı , ancak genc cevabı işe yarıyor.
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 Annoucements
kullanarak bulur EntityFieldQuery()
. Daha sonra tüm $nids
sonuç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.
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
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 .
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.
'nid' > 5000
?
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: node
Varlı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);
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).
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
@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);'
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.
Bunu, şu şekilde verilen devel modülü ile de yapabilirsiniz: Belirli bir içerik türünün düğümlerini Drush ile silebilir miyim?
Devel modülünü takın ve tüm düğümleri silmek için drush kullanın,
$ drush genc - öldür 0 0
Ayrıca bir yazı seçeneği de sunabilirsiniz,
$ drush genc --kill --types = makale 0 0