作成されたX週間後にノードを削除する


15

たとえば、作成された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のルールでどのようにできますか?
ロビンソン

1
これは、サイトビルダー/ルールベースのアプローチとは意図的に異なるアプローチでした。それに応じて、@ UnsettlingTrendに回答を更新してもらいます。私はまだD8でルールを試したことがないので、そのモジュールに基づいたソリューションについて話すことができます。
ショーンコン

7
$ nodes = $ storage-> loadMultiple($ nids)を使用してから$ storage-> deleteMultiple($ nodes)を使用する方が少し高速ですが、数十個のノードを削除する場合を除き、大きな問題ではありません。
ベルディール

@SiMoNeはまだできません。ルールスケジューラモジュールはまだありません。さらに、ルール8は本番環境に対応していません。
Sssweatなし

1
スケールアウトのキューベースのアプローチを作成します。ルールは必要ありません。
ケビン

4

Shawn Connの答えに基づいて、初心者向けの完全なソリューションを以下に示します。

  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を実行するたびに、公開されたノード/ページ-2週間、またはこれから何でも、今から削除されます。

  6. 注:cronを実行するタイミングをスケジュールするには、yoursite.com / admin / config / system / cronにアクセスします

テスト:

ノードを作成し、通常は右側のサイドバーにある公開日を-2週間または現在の日付に変更します。yoursite.com/admin/config/system/cronでcronを手動で実行すると、ノードが見つからないはずです。


終了する必要はありません?>。これにより、一部のサーバー設定でエラーが発生します。QueueAPIを使用して、より構造化されたセットアップを行うことをお勧めします。削除するノードが数千または数百であっても、上記のcron op内でシステムがハングアップすることはありません。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個のノードタイプのサイトに持っていると言うpagearticle... 2週間以上前に作成日付とどのようにタイプのノードのみを削除するarticleタイプのノードを削除せずにpage...謙虚なphpのスキルを失いますが、上記のコードではそのような実装を確認できませんでした。ありがとう
エリーマサド

0

私はそのようにしようとするでしょう:

  1. 2週間以上前のすべてのノードのビューを作成する
  2. Cronメンテナンスで実行するシステムルールを作成する
  3. ルール構成で、これらのビュー結果を反復処理するループを作成します
  4. 各ノードを削除

チャンスがあったときにテストしてみます。3。のようなビューを利用することがどれほど簡単/可能かは完全にはわからないからです。しかし、そこから始めます。もちろん、これには、2週間経過した時点でノードが削除されないという警告が伴いますが、Cronがシステムで実行されるタイミングに依存します。しかし、私は3時間以内で十分だと思います。

(これはD8向けであることに気付いただけですが、プロセスはまだ健全だと思います。)


D8を入力するまで、私はD8に気づきませんでした。D8のルールは安定版のアルファ版であることを知っています。まだ試していません。
UnsettlingTrend

開発版のルールを使用しました。私が試していたものは安定しているように見えましたが、ビューの結果をループするために使用するビュールールモジュールのD8バージョンは、他の方法では計画されていないようです。考えられないルールでビューを取得する方法があれば、うまくいくかもしれません。そうでなければ、私にはわかりません。
UnsettlingTrend
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.