Jawaban:
Jika Anda mencari solusi yang berpusat pada pengembang, Anda dapat menggunakan hook_cron()
modul khusus untuk membersihkan node lama:
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();
}
}
Berdasarkan jawaban Shawn Conn, berikut ini solusi lengkap untuk pemula:
Buat file di folder yang baru Anda buat bernama: "delete_old_nodes.info.yml" dan rekatkan kode ini di dalamnya:
name: Delete old nodes
description: Deletes nodes older than 30 days.
package: Custom
type: module
version: 1.0
core: 8.x
Buat file bernama "delete_old_nodes.module" dan masukkan kode ini ke dalamnya:
<?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();
}
}
?>
Siram cache, lalu arahkan ke halaman modul - (yoursite.com/admin/modules) - dan aktifkan modul Anda, (dengan mencari "hapus node lama", klik kotak centang dengan nama modul dan klik simpan).
Selesai! Setiap kali Anda menjalankan cron, node / halaman yang diterbitkan -2 minggu, atau apa pun yang Anda miliki, mulai sekarang akan dihapus.
Catatan: Untuk menjadwalkan saat cron berjalan, buka yoursite.com/admin/config/system/cron
Pengujian:
Buat simpul dan ubah tanggal publikasi, biasanya di sidebar kanan, ke -2 minggu atau apa pun yang Anda miliki. Jalankan cron secara manual di yoursite.com/admin/config/system/cron dan Anda seharusnya tidak dapat menemukan simpul Anda.
Saya akan menggunakan hook_cron()
implementasi juga, tetapi menggunakan kode berikut.
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);
}
}
Kode yang saya gunakan untuk menghapus node adalah kode yang pesan penyusutannya entity_delete_multiple()
disarankan untuk digunakan.
Saya juga menggunakan panggilan untuk accessCheck(FALSE)
menghindari permintaan entitas mengembalikan hanya node yang memiliki akses pengguna anonim. (Tugas Cron dijalankan sebagai pengguna anonim.)
Jika ada kemungkinan node untuk dihapus terlalu banyak, saya akan membatasi jumlah node yang dihapus setiap kali tugas cron dijalankan.
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
, Terima kasih
hook_cron()
Implementasi terakhir yang ditunjukkan sudah melakukan hal itu, sebagaimana panggilannya range()
, berbeda dari implementasi sebelumnya.
range()
seperti yang saya mengerti, akan membatasi jumlah node dihapus setiap kali tugas cron menjalankan. Tetapi katakanlah saya memiliki di situs 30 node jenis page
& article
dengan tanggal pembuatan lebih dari 2 minggu yang lalu ... Bagaimana cara menghapus hanya simpul jenis article
tanpa menghapus simpul jenis page
? ... Maafkan kemampuan php saya yang sederhana tapi saya tidak bisa melihat implementasi seperti itu dalam kode di atas! Terima kasih
Saya akan mencoba melakukannya seperti itu:
Saya akan mencoba mengujinya ketika saya mendapat kesempatan, karena saya tidak sepenuhnya yakin betapa mudah / mungkinnya untuk menggunakan tampilan seperti itu di 3., tapi di situlah saya akan mulai. Tentu saja, ini datang dengan peringatan bahwa itu tidak akan menghapus node ketika menjadi tepat 2 minggu, tetapi akan tergantung pada kapan Cron berjalan pada sistem Anda; tapi, saya berasumsi dalam 3 jam atau lebih masih cukup.
(Saya hanya memperhatikan ini untuk D8; Saya pikir prosesnya masih bagus.)