コメントの一括削除


11

すべてのコメントを一度に削除するにはどうすればよいですか?ノードとバルク削除モジュールでそれを行う方法を見てきました、特定のコンテンツタイプのすべてのノードを削除する方法は? しかし、コメントのために同様の解決策を見ています。

データベースにアーティファクトを残さないソリューションを探しています。Views Bulk Operationsは最良のソリューションですか?

回答:


7

私の知る限り、VBOはその仕事をすることができるはずですが、私は自分でコメントを削除しようとしませんでした。

別の方法は、dbからすべてのクエリのリストを取得し、コメントIDの配列を作成して、その配列をcomment_delete_multiple関数に渡すコードを(モジュールまたはDevelモジュールの「execute php」ブロックで)実行することです。これは完了するまでに時間がかかる場合があります(サーバーのパフォーマンスとコメントの数によって異なります)。そのため、たとえばset_time_limit(http://php.net/manual/en/function .set-time-limit.php)またはDrupalのバッチAPI。

[更新:このアプローチに基づくコード例については、Chris Cohenの回答を参照してください。]


7

これは代替回答ではなく、マルクヴァンゲンドの詳細ですが、私は彼の回答についてコメントしたり、サンプルコードを残したりできませんでした。したがって、develの実行コードブロックを使用した手動のアプローチは、次のようになります。


$cids = db_select('comment', 'c')
  ->fields('c', array('cid'))
  ->execute()
  ->fetchCol();

comment_delete_multiple($cids);

marcvangendが指摘するように、これはサーバーでの実行時間に制限されるため、コメントが多い場合は一時的に上げる必要があります。dbtngの援助をしてくれたmanarthとinstanceofjamieに感謝します。


1
指示をありがとう、しかしあなたの構文はオフです。テーブルはcommentであり、エイリアスが必要です。生オブジェクトの結果を直接に入力することはできませんcomment_delte_multiple
brian_d

@brian_d comment_delte_multiple()の準備ができている生のオブジェクト結果をどのように処理しますか?
jackocnr

2

個人的には、ビューの一括操作モジュールに行きます。

このモジュールは、表示された行に対して一括操作を実行できるようにすることで、ビューを拡張します。これは、各ノードの前にチェックボックスを表示し、適用可能な操作を含む選択ボックスを追加することによって行われます。Drupal Coreまたはルールのアクションを使用できます。


0

正直なところ、これを実行する必要があるときは、データベースで実行しました。コメントを削除し、コメントの統計と偽装を修正すると、すべてのコメントが消えます。奇妙な方法でコメントとやり取りするモジュールがある場合は、これを避けます。それ以外の場合は、これを提案します。

TRUNCATE TABLEコメント

UPDATE node_comment_statistics SET comment_count = 0


drupal API呼び出しを使用する利点は、comment_delete_multiple追加のdrupalフックを呼び出すことができるため、DBがクリーンになる可能性があることです。
brian_d 2011年

そのため、コメントを操作するモジュールがある場合は、回避することをお勧めします。そうでなければ、あなたが株のコメントを持っているなら、私はそれに関するどんな問題にも決して触れませんでした。あなたが何千ものコメントでスパムされたサイトを持っているなら、それは確かにはるかに簡単です。
G.Martin、2011年

テーブル 'field_data_comment_body'もコメントのコンテンツが格納される場所なので、切り捨てる必要があります。
Creynders 2013年

0

いくつかのUIツール以下のモジュールをインストールできます

ビュー-drupal.org/project/views

すべてのDrupalサイトに必要だと思います...バックエンドでSQLを生成し、構成可能な設定、フィルター、並べ替え、ページングなどで結果を表示します...など

VBO- http: //drupal.org/project/views_bulk_operations 一括操作を許可する(つまり、このスレッドのコメントを削除する)

管理ビュー- http://drupal.org/project/admin_views ビューとVBOの利点は、元contnet、コメント、menu_alterによるユーザ管理ページを置き換えてください...

  1. 上記のモジュールを有効にした後、コメント管理ページに戻ります
  2. [すべて選択]にチェックマークを付けます(注意してください。すべてのコメントを削除することを確認してください...)
  3. [削除]と[送信]を選択します注意してください。後で確認ボタンは表示されなくなります...)

0

バックアップと移行モジュールを使用して、約45,000件のコメントの削除を実現しました。「次のテーブルからデータを除外する」の詳細設定で、最初にCtrlキーを押してリストからコメントを選択します(ここでは不要なキャッシュテーブルがすでに選択されているため注意してください)-バックアップ-このバックアップファイルから復元します。フラー!


0

この回答は既にリストされている回答に似ていますが、約27,000件のコメントに対する「メモリ不足エラー」を防ぐために変更しました。コメントの数によっては、実行に時間がかかります。コメントテーブルを単に切り捨てるのは良い考えではないかもしれません。Drupalにコンテンツの削除を処理させるのが最善です。

PHPスクリプトを作成しました。

$cids = db_select('comment', 'c')
  ->fields('c', array('cid'))
  ->execute()
  ->fetchCol();

foreach($cids as $cid)
{
  comment_delete($cid);
}

... Drushでスクリプトを実行しました

drush @my_alias php-script my_script.php

0

私は通常、VBOを使用してコメントまたはノードを一括で削除することをお勧めしますが、何十万ものコメントがあり、時間があまりない場合は、承認されていないコメントをすべて削除するSQLクエリを次に示します私の場合、DBで1.2 GBのスペースを使用していたコメントに関連するすべてのリビジョンとデータとともに

DELETE c, rcb, dcb
FROM
    comment AS c
JOIN field_revision_comment_body AS rcb ON (c.cid = rcb.entity_id)
JOIN field_data_comment_body AS dcb ON (rcb.entity_id = dcb.entity_id)
WHERE
    c. STATUS = 0

-2

PHPフィルターを有効にし、次のコードで基本的なページを作成します。

<?php
  db_query("TRUNCATE TABLE {comment}");
  db_query("UPDATE {node_comment_statistics} SET comment_count = 0");
?>

1
そのようなものにはPHPフィルターを決して使用しないでください(他のことでも、PHPフィルターは一般にDrupalで最悪のアイデアの1つです)
Alejandro Moreno '22
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.