すべてのノード/フィールドリビジョンを削除するにはどうすればよいですか?


17

私は、ノードとフィールドのリビジョンを保持するdrupal 7サイトを持っています。誤って新しい障害バージョンが保存され、元に戻したい場合に備えて、リビジョンを保持しています。

しかし、今度はデータベースをクリーンアップして最適化し、ハードディスクのスペースを節約したいと思います。

サイトのすべてのノード/フィールドについて、現在のリビジョンを除くすべてのリビジョンを削除する方法は何ですか?

回答:


13

Node Revision Deleteモジュールを使用して、リビジョンを削除および管理します。(私はモジュールのメンテナーです。)

Node Revision Deleteモジュールを使用すると、選択に応じてノードのリビジョンを管理できます。ノードのリビジョンの特定の数を保持するのに役立ちます。このモジュールは、特定のコンテンツタイプにリビジョン削除を適用し、特定の時間に実行する柔軟性を提供します。ノードリビジョンの削除管理ページから設定を管理できます。


Node Revision Deleteでフィールドリビジョンを削除できますか?このモジュールでこれを行うオプションはありません
BlondeSwan

15

リビジョンを削除するための安定したリリースはまだありませんが、D7ポート準備中です(機能するかどうかはわかりません)。

このスレッドで、誰かがVBOを使用してリビジョンを分離し、削除することを提案しました。

APIに慣れている場合は、すべてのノードでループを作成し、を使用してリビジョンを取得し、を使用node_revision_list()してそれらを削除しますnode_revision_delete()

最後の手段として、もし私が DBをいじるのが好きなら、リビジョンの行field_revision_*node_revisionテーブルを削除できます。これを試して:

警告:まったくテストされていません!

DELETE FROM field_revision_body
WHERE NOT EXISTS (
  SELECT NULL
  FROM node
  WHERE vid = revision_id
);

DELETE FROM node_revision
WHERE NOT EXISTS (
  SELECT NULL
  FROM node
  WHERE node.vid = node_revision.vid
);

information_schemaデータベースでリビジョンのテーブルの完全なリストを見つけることができます:

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE 'field_revision%'
AND TABLE_SCHEMA = 'your_database';

3
Node Revision Deleteモジュールに安定したリリースが追加されました。
フリーラジカル

これをテストすると、node_revisionクエリの条件はになるはずですWHERE node.vid = node_revision.vid。そのままのエラー。おそらくfield_revision_bodyクエリでもテーブルを指定しますか?
digitgopher

この回答に記載されているRevision Deletionモジュールは、同じことを行う5つのモジュールを必要としないため、代わりにNode Revision Deleteの使用を推奨しています。受け入れられた回答を参照してください。
mbomb007

2

同じ状況で、以下のコードを使用しました。

foreach (node_load_multiple($nids) as $node) {
  // Delete sub revisions.
  foreach (node_revision_list($node) as $vid => $revision) {
    node_revision_delete($vid);
  }
  // Delete archived revisions.
  revisioning_delete_archived_revisions($node);
}

1

私はこれをVBO向けに作成し(任意のPHPを実行)、すべてのリビジョンを削除します(現在を除く)。これはに組み込まれたソート順に依存しnode_revision_list()その生データを使用する前に、望ましい結果のためにあなたのDB&テストをバックアップ

  krumo($entity);

  $revision_array = node_revision_list($entity);  
  $revision_array_ASC = array_reverse($revision_array, TRUE);
  krumo($revision_array_ASC);
  krumo(count($revision_array_ASC));

  foreach ($revision_array_ASC as $vid => $node) {
    $count = count($revision_array_ASC);
    if ($count > 1) {
          node_revision_delete($vid);
    }
  }

  $revision_array = node_revision_list($entity);  
  krumo($revision_array);

現在のリビジョン(ソート、カウント)の削除を避けるために大きな問題を抱えているようです。ただし、node_revision_deleteはすでに現在のリビジョンを削除できません。
dxvargas

0

Node Revision Deleteモジュールに安定したリリースが追加されました。

Node Revision Deleteモジュールを使用すると、コンテンツタイプの古いリビジョンを追跡および整理できます。特徴:

  • コンテンツタイプごとに保持するリビジョンの最大量を定義します。
  • Drush、cron実行、または別の期間(毎日、毎週など)で実行します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.