Yanıtlar:
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();
}
}
Shawn Conn'un cevabına dayanarak, acemiler için tam çözüm:
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"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();
}
}
?>Ö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).
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.
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.
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);
}
}
article
hook_cron()uygulama, daha önce de söylediği gibi range(), önceki uygulamadan farklı olarak bunu yapar .
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
Ben böyle yapmaya çalışın:
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.)