回答:
開発者中心のソリューションを探している場合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();
}
}
Shawn Connの答えに基づいて、初心者向けの完全なソリューションを以下に示します。
作成したフォルダーに「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
「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();
}
}
?>
キャッシュをフラッシュし、モジュールページ(yoursite.com/admin/modules)に移動し、モジュールを有効にします(「古いノードの削除」を検索して、モジュール名のチェックボックスをクリックし、[保存]をクリックします)。
できた!cronを実行するたびに、公開されたノード/ページ-2週間、またはこれから何でも、今から削除されます。
注:cronを実行するタイミングをスケジュールするには、yoursite.com / admin / config / system / cronにアクセスします
テスト:
ノードを作成し、通常は右側のサイドバーにある公開日を-2週間または現在の日付に変更します。yoursite.com/admin/config/system/cronでcronを手動で実行すると、ノードが見つからないはずです。
私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);
}
}
article
、ありがとう
hook_cron()
示されている最後の実装range()
は、前の実装とは異なり、を呼び出すときに既にそれを実行しています。
range()
私が理解し、ノード数がcronタスクを実行するたびに削除制限されます。しかし、私は30個のノードタイプのサイトに持っていると言うpage
&article
... 2週間以上前に作成日付とどのようにタイプのノードのみを削除するarticle
タイプのノードを削除せずにpage
?...謙虚なphpのスキルを失いますが、上記のコードではそのような実装を確認できませんでした。ありがとう
私はそのようにしようとするでしょう:
チャンスがあったときにテストしてみます。3。のようなビューを利用することがどれほど簡単/可能かは完全にはわからないからです。しかし、そこから始めます。もちろん、これには、2週間経過した時点でノードが削除されないという警告が伴いますが、Cronがシステムで実行されるタイミングに依存します。しかし、私は3時間以内で十分だと思います。
(これはD8向けであることに気付いただけですが、プロセスはまだ健全だと思います。)