Видаліть вузол через X тижнів, коли він був створений


14

Як я можу видалити вузол після, наприклад, 2 тижня його створення?

Відповіді:


18

Якщо ви шукаєте рішення, орієнтоване на розробників, ви можете hook_cron()скористатися спеціальним модулем для очищення старих вузлів:

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?
RobinSon

1
Це навмисно відрізнявся від підходу, який базується на розробнику сайтів / на правилах. Я б попросив @UnsettlingTrend відповідно оновити його відповідь. Я ще не випробував Правила в D8, тому можу говорити з рішенням, заснованим на цьому модулі.
Шон Конн

7
Використання $ nodes = $ storage-> loadMultiple ($ nids), а потім $ storage-> deleteMultiple ($ nodes) трохи швидше, але якщо ви не видалите десятки вузлів, це не велика проблема.
Бердір

@SiMoNe ви ще не можете. Ще немає модуля планування правил, плюс правила 8 не готові до виробництва.
Без зачистки

1
Я б створив підхід на основі черги для масштабування. Вам не потрібні Правила.
Кевін

4

Виходячи з відповіді Шона Конна, ось повне рішення для новачків:

  1. Перейдіть у каталог кореневих файлів і створіть папку "delete_old_nodes"
  2. Створіть файл у створеній вами папці під назвою: "delete_old_nodes.info.yml" і вставте цей код у неї:

    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" та введіть у нього цей код:

    <?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. Очистіть кеш, потім перейдіть на сторінку модулів - (yoursite.com/admin/modules) - і ввімкніть свій модуль, (шукаючи "видалити старі вузли", поставте прапорець за назвою модулів і натисніть кнопку "Зберегти").

  5. Готово! Щоразу, коли ви запускаєте cron, вузли / сторінки, які були опубліковані за два тижні, або все, що у вас є, відтепер буде видалено.

  6. Примітка. Щоб запланувати час запуску Cron, перейдіть на сайт yourite.com/admin/config/system/cron

Тестування:

Створіть вузол і змініть опубліковану дату, як правило, в правій бічній панелі, на -2 тижні або все, що у вас є. Запустіть cron вручну на yoursite.com/admin/config/system/cron, і вам не вдасться знайти свій вузол.


Вам не потрібно закриття?>. Це призведе до помилок у деяких налаштуваннях сервера. Я б радив мати більш структуровану настройку за допомогою QueueAPI, тому, якщо є тисячі або навіть сотні вузлів для видалення, вона не зависить систему в операційній версії вище. sitepoint.com/…
Кевін,

Ага. Коли б у мене не було?>, Код не працював би для мене.
Кріс Щасливий

2

Я також використовував би hook_cron()реалізацію, але використовуючи наступний код.

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);
  }
}

Код, який я використовував для видалення вузлів, є тим, яким пропонується використовувати повідомлення про entity_delete_multiple()депресацію.
Я також використовував дзвінок, щоб accessCheck(FALSE)уникнути запиту сутності, який повертає лише ті вузли, до яких анонімний користувач має доступ. (Завдання Cron виконуються як анонімний користувач.)

Якщо тоді є можливість, щоб вузлів для видалення було занадто багато, я би обмежував кількість вузлів, видалених щоразу, коли виконується завдання Cron.

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 ваша відповідь врятувала мій час! і замість того, щоб розміщувати нове запитання, яке буде дублікатом цього, можете, будь ласка, детальніше розглянути, як обмежити видалення вузлів до вузла типу article , Дякую
Елі Масаад

Остання hook_cron()реалізована реалізація вже робить це, як називається range(), відмінним від попереднього впровадження.
kiamlaluno

Як range()я розумію, обмежуватиметься кількість видалених вузлів кожного разу, коли виконуються завдання Cron. Але скажіть, у мене на сайті 30 вузлів типів page& articleз датою створення більше 2 тижнів тому ... Як видалити лише вузли типу articleбез видалення вузла типу page? ... Вибачте за мої скромні навички роботи з PHP, але я не міг побачити таку реалізацію у наведеному вище коді! Дякую
Елі Масаад

0

Я б спробував зробити це як таке:

  1. Створіть перегляд усіх вузлів, яким виповнилося 2+ тижнів
  2. Створіть системне правило для запуску із обслуговування Cron
  3. У конфігурації правила створіть цикл для повторення цих результатів перегляду
  4. Видаліть кожен вузол

Я спробую перевірити це, коли отримаю шанс, тому що я не зовсім впевнений, наскільки легко / можливо, вдасться використати вигляд, подібний до 3, але я точно би там почав. Звичайно, це стосується застереження про те, що він не видалить вузли, коли стане ТОЧНО 2 тижні, але буде залежати від того, коли Cron працює у вашій системі; але, я припускаю, що протягом 3 годин або близько цього все-таки достатньо.

(Я тільки що помітив, що це стосується D8; я думаю, що процес все ще звучить.)


Я не усвідомлював D8, поки не набрав це. Я просто знаю, що правила є альфа-стабільними для D8; ще не пробував.
UnsettlingTrend

Я пішов з розробленою версією Правил. Для того, що я намагався, це здавалося стабільним, але я застряг у тому, що, здається, немає - планується інше - версія D8 модуля «Правила перегляду», яка використовується для переходу до результатів перегляду. Якщо є спосіб отримати перегляд у правилі, про який я не можу придумати, це може спрацювати. Інакше я не впевнений.
UnsettlingTrend
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.