Bir düğümü oluşturulduktan sonra X hafta sonra silme


14

Bir düğümü, örneğin 2 hafta oluşturulduktan sonra nasıl silebilirim?

Yanıtlar:


18

Geliştirici merkezli bir çözüm arıyorsanız, hook_cron()eski düğümleri temizlemek için özel bir modülde çağrı yapabilirsiniz :

function MYMODULE_cron() {

  // Other conditions can be altered/added as neeed
  $query = \Drupal::entityQuery('node')
    ->condition('created', strtotime('-2 week'), '<=');
  $nids = $query->execute();
  foreach ($nids as $nid) {
    $node = node_load($nid);
    $node->delete();
  }
}

Drupal 8'deki kurallarla nasıl yapabilirim?
RobinSon

1
Bu, site oluşturucudan / Kurallara dayalı yaklaşımdan kasıtlı olarak farklı bir yaklaşımdı. @UnsettlingTrend'den cevabını buna göre güncellemesini rica ediyorum. D8'de henüz kuralları denemedim, bu yüzden bu modüle dayalı çözümle konuşabiliyorum.
Shawn Conn

7
$ Nodes = $ storage-> loadMultiple ($ nids) ve ardından $ storage-> deleteMultiple ($ nodes) kullanımı biraz daha hızlıdır, ancak düzinelerce düğümü silmediğiniz sürece büyük bir sorun değildir.
Berdir

@SiMoNe henüz yapamazsınız. Henüz kural zamanlayıcı modülü yok, ayrıca Kural 8 üretime hazır değil.
Hayır Sssweat

1
Ölçeklendirme için sıra tabanlı bir yaklaşım yaratacağım. Kurallara ihtiyacınız yok.
Kevin

4

Shawn Conn'un cevabına dayanarak, acemiler için tam çözüm:

  1. Kök dosya dizininize gidin ve "delete_old_nodes" klasörü oluşturun
  2. Az önce oluşturduğunuz klasörde "delete_old_nodes.info.yml" adlı bir dosya oluşturun ve bu kodu buraya yapıştırın:

    name: Delete old nodes
    description: Deletes nodes older than 30 days.
    package: Custom
    type: module
    version: 1.0
    core: 8.x
  3. "Delete_old_nodes.module" adlı bir dosya oluşturun ve bu kodu içine yerleştirin:

    <?php
    
    function delete_old_nodes_cron() {
    
      $query = \Drupal::entityQuery('node')
        ->condition('created', strtotime('-2 week'), '<='); // Can change -2 week to -2 year or -3 day
      $nids = $query->execute();
      foreach ($nids as $nid) {
        $node = node_load($nid);
        $node->delete();
      }
    }
    
    ?>
  4. Önbelleği temizleyin, ardından modüller sayfasına gidin - (siteniz.com/admin/modules) - ve modülünüzü etkinleştirin ("eski düğümleri silin" için arama yaparak modül adının yanındaki onay kutusunu ve kaydet'i tıklayın).

  5. Bitti! Cron'u her çalıştırdığınızda, -2 hafta yayınlanan düğümler / sayfalar veya sahip olduğunuz her şey bundan sonra silinecektir.

  6. Not: Cron'un ne zaman çalışacağını planlamak için siteniz.com/admin/config/system/cron adresine gidin.

Test yapmak:

Bir düğüm oluşturun ve yayınlanan tarihi, normalde sağ kenar çubuğunda, -2 haftaya veya sahip olduğunuz her şeye değiştirin. Cron'u siteniz.com/admin/config/system/cron adresinden manuel olarak çalıştırın ve düğümünüzü bulamamanız gerekir.


Kapanışa ihtiyacınız yok mu? Bu, bazı sunucu kurulumlarında hatalara neden olur. QueueAPI kullanarak daha yapılandırılmış bir kuruluma sahip olmanızı öneririm, bu şekilde silinecek binlerce hatta yüzlerce düğüm varsa, sistemi yukarıdaki cron op içinde kapatmaz. sitepoint.com/…
Kevin

Huh. ?> 'A sahip olmadığımda, kod benim için çalışmaz.
Chris Happy

2

Ben de bir hook_cron()uygulama kullanmak istiyorsunuz , ama aşağıdaki kodu kullanarak.

function mymodule_cron() {
  $storage_handler = \Drupal::entityTypeManager()
    ->getStorage('node');
  $query = \Drupal::entityQuery('node')
    ->accessCheck(FALSE)
    ->condition('created', strtotime('-2 week'), '<=');
  $result = $query->execute();
  if (!empty($result)) {
    $nids = array_keys($result);
    $nodes = $storage_handler->loadMultiple($nids);
    $storage_handler->delete($nodes);
  }
}

Düğümleri silmek için kullandığım kod, kullanımdan entity_delete_multiple()kaldırma mesajının kullanılmasını önerdiği koddur .
Ayrıca accessCheck(FALSE)varlık sorgusu yalnızca anonim kullanıcının erişimine sahip düğümleri döndürmesini önlemek için bir çağrı kullandım . (Cron görevleri anonim kullanıcı olarak çalışır.)

Eğer o zaman düğümlerin silinme olasılığı çok fazlaysa, cron görevleri her çalıştığında silinen düğüm sayısını sınırlandırırdım.

function mymodule_cron() {
  $storage_handler = \Drupal::entityTypeManager()
    ->getStorage('node');
  $query = \Drupal::entityQuery('node')
    ->accessCheck(FALSE)
    ->condition('created', strtotime('-2 week'), '<=')
    ->range(0,30);
  $result = $query->execute();
  if (!empty($result)) {
    $nids = array_keys($result);
    $nodes = $storage_handler->loadMultiple($nids);
    $storage_handler->delete($nodes);
  }
}

Bu sorunun eski olduğunu biliyorum ama @kiamlaluno cevabınız zamanımı kurtardı! ve bunun bir kopyası olacak yeni bir soru göndermek yerine, düğümlerin silinmesinin tür düğümü ile nasıl sınırlandırılacağı hakkında daha fazla ayrıntı article
verebilir

Gösterilen son hook_cron()uygulama, daha önce de söylediği gibi range(), önceki uygulamadan farklı olarak bunu yapar .
kiamlaluno

range()Anladığım kadarıyla, düğüm sayısı cron görevleri her çalıştırdığınızda silinir sınırlayacaktır. Ama sitede 30 çeşit düğüm oluşturduğumu pageve articleoluşturma tarihi 2 haftadan daha uzun sürdüğünü söyleyin ... Tip articledüğümünü silmeden yalnızca tür düğümleri nasıl silinir page? ... mütevazı php becerilerimi özür dilerim ama yukarıdaki kodda böyle bir uygulama göremedim! Teşekkürler
Elie Masaad

0

Ben böyle yapmaya çalışın:

  1. 2 haftadan eski olan tüm düğümlerin bir Görünümünü oluşturun
  2. Cron bakımında çalıştırmak için bir sistem Kuralı oluşturun
  3. Kural yapılandırmasında, bu görünüm sonuçları üzerinde yineleme yapmak için bir döngü oluşturun
  4. Her düğümü sil

Bir şans bulduğumda test etmeye çalışacağım, çünkü görünümü 3'te böyle kullanmanın ne kadar kolay / mümkün olacağından tam olarak emin değilim, ama kesinlikle başlayacağım yer burası. Tabii ki, bu tam 2 haftalık hale geldiğinde düğümleri silmeyeceği, ancak Cron'un sisteminizde çalıştığına bağlı olacağı uyarısı ile birlikte gelir; ancak 3 saat içinde hala yeterli olduğunu düşünüyorum.

(Sadece bunun D8 için olduğunu fark ettim; sanırım süreç hala sağlam.)


Bunu yazana kadar D8'i fark etmedim. Ben sadece kural D8 için istikrarlı için alfa olduğunu biliyorum; henüz denemedim.
UnsettlingTrend

Rules'un dev sürümü ile gittim. Denediğim şey için, kararlı görünüyordu, ama görünüm sonuçları üzerinde döngü için kullanmak için Görünüm Kurallar modülünün - başka türlü planlanmış - D8 sürümü gibi görünmüyor aslında sıkışmış. Görüşlerini aklıma gelmeyen bir Kuralda almanın bir yolu varsa, işe yarayabilir. Aksi takdirde, emin değilim.
UnsettlingTrend
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.