回答:
はい、あなたが言うように、Drupal 7でこれを行うことができるモジュールのリストがあります:
ノードリビジョン削除モジュールを使用すると、コンテンツタイプの古いリビジョンを追跡およびプルーニングできます。コンテンツタイプごとに保持するリビジョンの最大量を定義します。Drush、cron実行、または別の期間(毎日、毎週など)で実行します。
ノードリビジョン制限モジュールを使用すると、各コンテンツタイプのノードのリビジョンを制限できます。このモジュールには、利用可能な各コンテンツタイプのノードリビジョンしきい値を指定する管理インターフェイスがあります。可能な設定には、ノードリビジョン制限の構成フォームで提供される、対応するリビジョン制限を持つノードタイプが含まれます。このモジュールは、ノードの現在のリビジョンを削除しないことに注意してください。
ノードリビジョンクリーンアップは、非常に大きなデータベース用に設計されています。Drushに慣れているサイト管理者。このモジュールの背後にある概念は、Drushを介して複数の呼び出しを同時に実行して、1秒あたりのノードリビジョンの削除数を最大化できるようにすることです。
このモジュールを使用すると、古いノードリビジョンを一括削除できます。可能な設定には、ノードタイプ、削除前のノードリビジョンの経過時間、Cron頻度設定などがあります。改訂は、管理ページでのレビュー後にも削除される場合があります。このモジュールは、ノードの現在のリビジョンを削除することも、削除することもできません。
Drupal 8の場合、現時点ではそれを行うためのモジュールはありませんが、使用できます。
ノードのリビジョンリストを取得するには:
$vids = \Drupal::entityManager()->getStorage('node')->revisionIds($node);
参照ノードは現在、ストレージコントローラを持っています。node_revision_list()が削除されました。
リビジョンリビジョンを削除するには、node_revision_delete()関数を使用できますが、最後に関数コードを参照してください:
function node_revision_delete($revision_id) {
\Drupal::entityTypeManager()->getStorage('node')->deleteRevision($revision_id);
}
だから、あなただけを使用した方が良いです:
\Drupal::entityTypeManager()->getStorage('node')->deleteRevision($revision_id);
entityManager
ますか?その非推奨だと思います。
特定のノードの最新リビジョン以外をすべて削除するスニペット:
<?php
try {
$nid = 123; // Your node id
$vids = \Drupal::entityManager()->getStorage('node')->revisionIds(node_load($nid));
foreach($vids as $vid){
\Drupal::entityTypeManager()->getStorage('node')->deleteRevision($vid);
}
} catch (Exception $e) {
// Latest revision will not be deleted but throws an error
return $e->getMessage();
}
?>
ここでの提案は正しいですが、いくつか言及する価値があります。
$vids = \Drupal::entityManager()->getStorage('node')->revisionIds(node_load($nid));
ただし、これは非推奨としてマークされているため、次のものに置き換える必要があります。
$vids = \Drupal::entityTypeManager()->getStorage('node')->revisionIds($node);
ここのコード例でもデフォルトのリビジョンを削除しようとすると、が発生し[error] Default revision can not be deleted
ます。それを回避するには、削除を次のようなものにラップすることをお勧めします。
// If revision id is not default, remove it.
if ($vid !== $node->getLoadedRevisionId()) {
print 'Removing revision ' . $vid . PHP_EOL;
\Drupal::entityTypeManager()->getStorage('node')->deleteRevision($vid);
}
Drupal 8:Node Revisions Autoclean用の作業モジュールがあります。
このモジュールにより、ノードのリビジョンストアを管理できます。管理者の設定に従って、古いリビジョンは自動的に削除されます。
各ノードタイプに対して保持するリビジョンの数を選択できます。公開された改訂後の最新の下書きは削除されません。日付でリビジョンを削除することもできます。
多くのノードを持つ大規模なウェブサイトの場合、cronまたはdrushコマンド(drush 9のみ)でリビジョンを削除することを選択できます。
まだ通常のcronの実行で実行されるとは期待しないでください。ただし、更新ノードで実行するように設定できます。これは私が完全に理解していないcronの問題です:https : //www.drupal.org/project/node_revisions_autoclean/issues/2958655
常に適切な方法でストレージを注入してください:
# my_module.services.yml
node_storage:
class: Drupal\node\NodeStorage
factory: entity_type.manager:getStorage
arguments: ['node']
my_service:
class: Drupal\my_module\MyService
arguments: ['@node_storage']
この場合、クラスコンストラクターに次のものを既に含めることができます。
class MyService {
/**
* @var \Drupal\node\NodeStorageInterface
*/
private $storage;
public function __construct(NodeStorageInterface $storage) {
$this->storage = $storage;
}
}
この場合、IDEは、このソリューションとは異なり、利用可能なすべてのメソッドを簡単にリストします。
\Drupal::entityManager()->getStorage('node')->revisionIds(node_load($nid));
EntityTypeManagerは、ほとんどの場合「多すぎる」能力です。必要な量だけ使用してください。サービス構成はそれを支援します。