Hapus node setelah X minggu itu dibuat

14

Bagaimana saya bisa menghapus simpul setelah, misalnya, 2 minggu telah dibuat?

RobinSon
sumber

Jawaban:

18

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();
  }
}
Shawn Conn
sumber
Bagaimana bisa melakukannya dengan aturan di drupal 8?
RobinSon
1
Ini sengaja merupakan pendekatan yang berbeda dari pembangun situs / pendekatan berdasarkan aturan. Saya akan meminta @UnsettlingTrend untuk memperbarui jawabannya. Saya belum mencoba Aturan di D8, jadi saya bisa berbicara dengan solusi berdasarkan modul itu.
Shawn Conn
7
Menggunakan $ nodes = $ storage-> loadMultiple ($ nids) dan kemudian $ storage-> deleteMultiple ($ nodes) sedikit lebih cepat, tetapi kecuali Anda menghapus lusinan node, bukan masalah besar.
Berdir
@SiMoNe Anda belum bisa. Tidak ada modul scheduler aturan, ditambah Aturan 8 belum siap produksi.
Tidak ada Sssweat
1
Saya akan membuat pendekatan berbasis antrian untuk scaling out. Anda tidak perlu Aturan.
Kevin
4

Berdasarkan jawaban Shawn Conn, berikut ini solusi lengkap untuk pemula:

  1. Buka direktori file root Anda dan buat folder "delete_old_nodes"
  2. 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
  3. 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();
      }
    }
    
    ?>
  4. 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).

  5. Selesai! Setiap kali Anda menjalankan cron, node / halaman yang diterbitkan -2 minggu, atau apa pun yang Anda miliki, mulai sekarang akan dihapus.

  6. 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.

Chris Happy
sumber
Anda tidak perlu tutup?>. Itu akan menyebabkan kesalahan pada beberapa pengaturan server. Saya akan menyarankan memiliki pengaturan yang lebih terstruktur menggunakan QueueAPI, dengan cara itu jika ada ribuan atau bahkan ratusan node untuk dihapus, itu tidak akan menutup sistem dalam op cron di atas. sitepoint.com/...
Kevin
Hah. Ketika saya tidak punya?>, Kode tidak akan berfungsi untuk saya.
Chris Happy
2

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);
  }
}
kiamlaluno
sumber
Saya tahu pertanyaan ini sudah lama tetapi @kiamlaluno jawaban Anda menghemat waktu saya! dan alih-alih memposting pertanyaan baru yang akan menjadi duplikat dari pertanyaan ini, dapatkah Anda menjelaskan lebih lanjut tentang cara membatasi penghapusan node ke tipe node article , Terima kasih
Elie Masaad
hook_cron()Implementasi terakhir yang ditunjukkan sudah melakukan hal itu, sebagaimana panggilannya range(), berbeda dari implementasi sebelumnya.
kiamlaluno
The 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& articledengan tanggal pembuatan lebih dari 2 minggu yang lalu ... Bagaimana cara menghapus hanya simpul jenis articletanpa menghapus simpul jenis page? ... Maafkan kemampuan php saya yang sederhana tapi saya tidak bisa melihat implementasi seperti itu dalam kode di atas! Terima kasih
Elie Masaad
0

Saya akan mencoba melakukannya seperti itu:

  1. Buat Tampilan semua node yang berumur 2+ minggu
  2. Buat Aturan sistem untuk dijalankan pada pemeliharaan Cron
  3. Dalam konfigurasi aturan, buat satu loop untuk beralih dari hasil tampilan tersebut
  4. Hapus setiap node

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.)

UnsettlingTrend
sumber
Saya tidak menyadari D8 sampai setelah saya mengetik itu. Saya hanya tahu aturan berada di alpha untuk stabil untuk D8; belum mencobanya.
UnsettlingTrend
Saya pergi dengan Peraturan versi dev. Untuk apa yang saya coba, tampaknya stabil, tapi saya terjebak pada kenyataan bahwa tampaknya tidak ada - direncanakan versi - versi D8 modul Views Rules yang akan digunakan untuk mengulang hasil tampilan. Jika ada cara untuk mendapatkan Tampilan dalam Aturan yang tidak bisa saya pikirkan, mungkin berhasil. Kalau tidak, saya tidak yakin.
UnsettlingTrend