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 page
ve article
oluşturma tarihi 2 haftadan daha uzun sürdüğünü söyleyin ... Tip article
düğü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.)