Belirli bir içerik türündeki tüm düğümleri nasıl silebilirim?


31

Belirli bir içerik türünden birkaç bin düğümüm var. Web arayüzünü kullanarak (example.com/admin/content), bir seferde sadece yaklaşık 50 silerim. Onları hızlıca nasıl silebilirim?

Yanıtlar:


32

Bunun için bir modül var (TM).

Toplu Silme bölümüne bakınız .

Bu, tek bir çağrı ile binlerce düğümü node_delete_multiple () ile silerken zaman aşımı veya bellek sorunlarını önlemek için düğümleri silmek için Toplu İş API'sini kullanır.

Toplu Silme terk edilmiş bir modüldür. Alternatifler için bakınız:


Vay, bunu tamamen özledim. İyi bulmak.
Greg

4
Basit bir içerik türü filtresinden daha fazlasını yapıyorsanız yararlı olabilecek başka bir yöntem de, Gösterim Toplu İşlemlerini kullanmaktır: drupal.org/project/views_bulk_operations
geerlingguy 09:11

Toplu Silme modülü şimdi terk edildi. Gösterim Toplu İşlemlerini kullanmanız önerilir.
Refineo,

26

Devel Generation modülüne ilham için baktığımızda, burada "içerik öldürme" işlevi devel_generate_content_kill:

function devel_generate_content_kill($values) {
  $results = db_select('node', 'n')
              ->fields('n', array('nid'))
              ->condition('type', $values['node_types'], 'IN')
              ->execute();
  foreach ($results as $result) {
    $nids[] = $result->nid;
  }

  if (!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(t('Deleted %count nodes.', array('%count' => count($nids))));
  }
}

Bu yüzden ya tüm düğümleri silmek için Devel Generate kullanarak ya da yeni bir tane yaratmadan ya da devel_generate_content_kill(array('node_types' => array('my_node_type')));doğrudan çağırmak için example.com/devel/php adresini kullanmaya çalışacağım .


17

Drupal 8'de bir yol, entityQuery () yöntemini EntityStorageInterface :: delete () yöntemiyle kullanmaktır:

$result = \Drupal::entityQuery("node")
    ->condition("type", "YOUR_CONTENT_TYPE_NAME")
    // If the update is being executed via drush entityQuery will only
    // return the content uid 0 have access to. To return all set
    // accessCheck to false since it defaults to TRUE. 
    ->accessCheck(FALSE)
    ->execute();

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadMultiple($result);
$storage_handler->delete($entities);

Başka filtreler / koşullar uygulamanız gerekiyorsa, QueryInterface arayüz sayfasını kontrol edebilirsiniz.

EDIT ( @ 4k4 sayesinde diğer şekilde):

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadByProperties(["type" => "YOUR_CONTENT_TYPE_NAME"]);
$storage_handler->delete($entities);

Kodu test etmek istiyorsanız kullanabilirsiniz:

drush php-eval '$storage_handler = \Drupal::entityTypeManager()->getStorage("node"); $entities = $storage_handler->loadByProperties(["type" => "article"]); $storage_handler->delete($entities);'

Bu, tüm makalelerinizi siler.


Bu doğru değil, delete (), varlık sorgularının döndürdüğü kimlikleri değil, yüklü varlıkları bekler. Tanımlayıcı olmayan bir $ sonucu yerine, $ ids veya $ nids ve ardından $ storage-> delete ($ storage-> load ($ ids)) kullanın.
Berdir

@Berdir teşekkürler, kodu tekrar test edeceğim, belki de bu sorun bir düzenlemede ortaya çıktı
Adrian Cid Almaguer

@Berdir Yanıtı güncellerim ve kodu test ederim ve çalışır, sorun tek bir düzenlemede ortaya çıktı.
Adrian Cid Almaguer

2
@AdrianCidAlmaguer, sorguyu 22$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
59'da

1
Son zamanlarda bir güncelleme kanca bu kullanılan, kullanmak eğer belirterek 's değerinde entityQuery ayarlamanız gerektiği konusunda accessCheckekstresinde. Aksi takdirde, sık sık çalıştırırsanız, varsayılan olarak accessCheck true olarak ayarlanır ve 0 kullanıcı kimliğine erişimi olmayan tüm düğümler döndürülmez.
awm,

13

Tamamen kullanıcı arayüzü aracılığıyla yapmak istiyorsanız devel_generate modülünü kullanabilirsiniz.

  1. "Konfigürasyon" içindeki "İçerik Üret" menüsüne gidin (admin / config / development / construc / content).
  2. Silmek istediğiniz içerik türlerini seçin.
  3. "Yeni içerik oluşturmadan önce bu içerik türlerindeki tüm içeriği sil" seçeneğinin yanındaki onay kutusunun işaretli olduğundan emin olun.
  4. Oluşturmak istediğiniz düğüm sayısını "0" olarak ayarlayın.

Bu şekilde, hiçbir düğüm oluşturulmayacak ve seçilen türlerin tüm düğümleri silinecektir.


10

Drupal kurulumun kök dizininde aşağıdaki kodla bir dosya oluşturun ve dosyayı yürütün.

<?php
  require_once './includes/bootstrap.inc';
  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

  $aquery= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'company'");
  while ($row = db_fetch_object($aquery)) {
    node_delete($row->nid);
  }
?>

1
db_fetch_object, D7 veritabanı api'sinin bir parçası değildir.
ya.teck

10

Bunu, Devel modülünün PHP Kodunu Çalıştır kısmını kullanarak Drupal 7'de yapabilirsiniz:

$result= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'TYPE'");
foreach ($result as $record) {
  node_delete($record->nid);
}

1
Bu, çok yavaş yürütülür, binlerce düğümü silmeniz gerekirse, VBO gibi toplu API'yi kullanan bir yöntemi kullanmak daha iyidir.
abielefeldt

6

Drush kullanıyorsanız ve tüm modülü sildiyseniz, bunu terminalde yapın:

 drush delete-all [content-type-machine-name]


Examples:
 drush delete-all article             Delect all article nodes.
 drush delete-all all                 Delete nodes of all types.
 drush delete-all --reset             Delete nodes of all types, and reset node, revision and comment counters.
 drush delete-all users               Delete users.

Options:
 --reset                              Reset counter for node, revision and comment tables.
 --roles                              pick roles

5

Toplu işlemleri görüntüleme, türüne göre filtreleme, arama kriterlerinize uyan tüm düğümlerin seçilmesi vb.

Bu benim Drupal 6'daki uygulamalı çözümüm - toplu silme işleminin yanı sıra, düğümleri toplu olarak düzenleyebilir ve başka birçok şey yapabilirsiniz.

Drupal 7 versiyonu henüz hazır değil gibi görünüyor - fakat D7 sürümü için bu modülü izliyordum.


4

Başka bir pasaj:

$query = db_query("SELECT n.nid FROM {node} n WHERE n.type = 'TO_BE_DELETED'"); 
while ($n = db_fetch_object($query)) 
{
     node_delete($n->nid); 
} 

TO_BE_DELETEDsilinecek içerik türü nerede .


3
Sadece Drupal 4.6, 5 ve 6 için çalıştığı not edilmelidir. Drupal 7 versiyonudb_delete('node')
Greg


3

Tüm modülü sil kullanıyorum , D8 ile iyi çalışıyor ve çok kullanışlı sarhoş komutları sağlıyor. Örneğin, articleiçerik türünün tüm içeriğini silmek için :

drush delete-all article  

Bu D8 ile çalışır mı? Modülü etkinleştirdim ancak alıyorum 'drush komutu' hepsini sil makaleyi yazdı 'bulunamadı. Ayrıca drush önbellek temizledim
Yassin Tahtah

1

Deneyebilirsin Tümünü sil , modül gezinmek için 'Yönetici / içerik / DELETE_CONTENT' ve belirli içerik türlerine ait içeriğin silinmesi için bir form ile sunulacak.

Saygılarımızla



0

Bu modül bir sitedeki tüm içeriği ve / veya kullanıcıları silmek için kullanılır. Bu, esas olarak, bazı durumlarda kullanışlı olabilecek bir geliştirici aracıdır.

https://www.drupal.org/project/delete_all

Toplu Silme modülünün toplu api'yi kullanarak belirli bir düğüm tipindeki düğümleri sileceği gibi. Az sayıda düğüm için Görüntüleme Toplu İşlemleri modülünün (VBO) kullanılması önerilir. Ancak 10.000 düğümü silmeniz gerekirse, bu modül daha iyi bir seçenek olabilir.

https://www.drupal.org/project/bulkdelete


0

İçerik türündeki tüm düğümleri programlı olarak silme burada yardımcı bir işlevdir:


function _delete_all_nodes_of_type($type = '') {
  // Return all nids of nodes of type.
  $nids = db_select('node', 'n')
    ->fields('n', array('nid'))
    ->condition('n.type', $type)
    ->execute()
    ->fetchCol(); // returns an indexed array
  if (!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(format_plural(count($nids), count($nids) . ' node Deleted.', count($nids) . ' nodes Deleted.'));
  }
}


-1

Db_delete kullanarak sona erdi , modül gerektirmiyor:

<?php
  db_delete('node')
    ->condition('type', 'MY_CONTENT_TYPE')
    ->execute();
?>

Düzenleme / Uyarı: Aşağıdaki Berdir'in yorumuna bakın. Bu yöntem, düğümlerle ilgili tüm verileri temizlemez.


3
Bu yaklaşımdaki sorun, diğer modüllerin bilgilerini de tepki gösterememesi ve silmemesidir. İçerik türüne bağlı olarak, o düğümün content_type tablosunda, alanlar, taksonomiler (aslında bir alan da), yorumlar vb. Bu yüzden muhtemelen veritabanında bir sürü eski bilgi ile bitirdiniz.
Berdir

@Berdir - İlginç. Düğümleri silmek için daha iyi bir yerleşik yol var mı?
Greg

3
Node_delete () ve node_delete_multiple () var, tim.plunket'in cevabını görün, ancak binlerce düğümü işlemek için tasarlanmadı, api.drupal.org/api/drupal/modules--node--node.module/function /… . Tüm düğümleri yükler ve ardından tek bir istekle üstlerinde yinelenir. Bu yüzden, yüzlerce veya binlerce düğümü silmek istiyorsanız bulkdelete gibi bir katkı modülünü kullanmak zorundasınız.
Berdir

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.