特定のコンテンツタイプのすべてのノードを削除する方法


31

特定のコンテンツタイプのノードが数千あります。Webインターフェース(example.com/admin/content)を使用すると、一度に削除できるのは約50個だけです。どうすればそれらをすばやく削除できますか?

回答:


32

そのためのモジュールがあります(TM)。

一括削除を参照してください。

バッチAPIを使用してノードを削除し、node_delete_multiple()の1回の呼び出しで数千のノードを削除するときのタイムアウトまたはメモリの問題を回避します。

一括削除は放棄されたモジュールです。代替案を参照してください:


うわー、私はこれを完全に逃しました。良い発見。
グレッグ

4
:あなたは、単純なコンテンツタイプのフィルタよりも多くやっている場合はもう一つの方法は、それが有用である可能性があり、ビューの一括操作を使用することですdrupal.org/project/views_bulk_operations
geerlingguy

一括削除モジュールは廃止されました。そこで、ビューの一括操作を使用することをお勧めします。
Refineo

26

インスピレーションのためにDevel Generateモジュールを見ると、その「コンテンツキル」機能がありますdevel_generate_content_kill

function devel_generate_content_kill($values) {
  $results = db_select('node', 'n')
              ->fields('n', array('nid'))
              ->condition('type', $values['node_types'], 'IN')
              ->execute();
  foreach ($results as $result) {
    $nids[] = $result->nid;
  }

  if (!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(t('Deleted %count nodes.', array('%count' => count($nids))));
  }
}

したがって、Devel Generateを使用してすべてのノードを削除して新しいノードを作成しないか、example.com / devel / phpを使用してdevel_generate_content_kill(array('node_types' => array('my_node_type')));直接呼び出します。


17

Drupal 8では、1つの方法として、entityQuery()メソッドとEntityStorageInterface :: delete()メソッドを使用します。

$result = \Drupal::entityQuery("node")
    ->condition("type", "YOUR_CONTENT_TYPE_NAME")
    // If the update is being executed via drush entityQuery will only
    // return the content uid 0 have access to. To return all set
    // accessCheck to false since it defaults to TRUE. 
    ->accessCheck(FALSE)
    ->execute();

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadMultiple($result);
$storage_handler->delete($entities);

他のフィルター/条件を適用する必要がある場合は、QueryInterfaceインターフェースページを確認できます

編集(他の方法、 @ 4k4のおかげで):

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadByProperties(["type" => "YOUR_CONTENT_TYPE_NAME"]);
$storage_handler->delete($entities);

コードをテストする場合は、次を使用できます。

drush php-eval '$storage_handler = \Drupal::entityTypeManager()->getStorage("node"); $entities = $storage_handler->loadByProperties(["type" => "article"]); $storage_handler->delete($entities);'

これにより、すべての記事が削除されます。


これは正しくありません。delete()は、エンティティクエリが返すIDではなく、ロードされたエンティティを予期します。説明のない$ resultの代わりに、$ idsまたは$ nidsを使用してから、$ storage-> delete($ storage-> load($ ids))を使用します。
ベルディール16

@Berdirおかげで、私は多分この問題は1つの編集で導入されました、もう一度コードをテストします
エイドリアンシドAlmaguer

@Berdir答えを更新し、コードをテストすると動作します。問題は1回の編集で導入されました。
エイドリアンシドアルマグエル16

2
@AdrianCidAlmaguerは、あなたがクエリを置き換えることができます$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
4k4

1
最近、これを更新フックで使用entityQuery accessCheckました。使用する場合は、ステートメントにon を設定する必要があることに注意してください。そうしないと、それを急いで実行した場合、デフォルトでaccessCheckがtrueに設定され、uid 0にアクセスできないノードは返されません。
awm

13

UIを介して純粋に実行する場合は、devel_generateモジュールを使用できます。

  1. 「構成」(admin / config / development / generate / content)の「コンテンツの生成」メニューに移動します。
  2. 削除するコンテンツタイプを選択します。
  3. [新しいコンテンツを生成する前にこれらのコンテンツタイプのすべてのコンテンツを削除する]の横のチェックボックスがオンになっていることを確認します。
  4. 生成するノードの数を「0」に設定します。

この方法では、ノードは生成されず、選択したタイプのすべてのノードが削除されます。


10

drupalインストールのルートに以下のコードでファイルを作成し、ファイルを実行します。

<?php
  require_once './includes/bootstrap.inc';
  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

  $aquery= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'company'");
  while ($row = db_fetch_object($aquery)) {
    node_delete($row->nid);
  }
?>

1
db_fetch_objectはD7データベースAPIの一部ではありません。
ya.teck

10

これを行うには、Drupal 7で次のように入力して、DevelモジュールのExecute PHP Code部分を使用します。

$result= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'TYPE'");
foreach ($result as $record) {
  node_delete($record->nid);
}

1
これは非常にゆっくり実行されます。数千のノードを削除する必要がある場合は、VBOなどのバッチAPIを使用するメソッドを使用することをお勧めします。
-abielefeldt

6

Drushを使用してすべてのモジュールを削除する場合は、ターミナルでこれを実行します。

 drush delete-all [content-type-machine-name]


Examples:
 drush delete-all article             Delect all article nodes.
 drush delete-all all                 Delete nodes of all types.
 drush delete-all --reset             Delete nodes of all types, and reset node, revision and comment counters.
 drush delete-all users               Delete users.

Options:
 --reset                              Reset counter for node, revision and comment tables.
 --roles                              pick roles

5

ビューの一括操作では、BatchAPI対応の構成可能なノード管理画面が提供されます。この画面では、種類によるフィルタリング、検索条件に一致するすべてのノードの選択などが可能です。

これがDrupal 6での私の実践的なソリューションです。バッチ削除に加えて、ノードを一括編集したり、他の多くのことを行うことができます。

Drupal 7バージョンはまだ準備ができていないように見えますが、D7リリースのためにそのモジュールを見ています。


4

別のスニペットは次のとおりです。

$query = db_query("SELECT n.nid FROM {node} n WHERE n.type = 'TO_BE_DELETED'"); 
while ($n = db_fetch_object($query)) 
{
     node_delete($n->nid); 
} 

TO_BE_DELETED削除するコンテンツタイプはどこですか。


3
Drupal 4.6、5、および6のみで機能することに注意してください。Drupal 7バージョンはdb_delete('node')
グレッグ

4

Develモジュールで、drushを使用:

drush genc 0 --types=article --kill

または、ここで説明されているUIで:http : //befused.com/drupal/delete-nodes-devel


devel_generate有効にする必要があるのはDevelサブモジュールです。そして、複数のタイプの場合drush genc 0 --kill --types="article, page"
18年

3

[すべて削除]モジュールを使用ます。D8で正常に機能し、非常に便利なブラシコマンドを提供します。たとえば、articleコンテンツタイプのすべてのコンテンツを削除するには:

drush delete-all article  

これはD8で機能しますか?モジュールを有効にしましたが、「delete-all article」というブラシコマンドが見つかりませんでした。また、キャッシュキャッシュをクリアしました
ヤシンタフタ

1

あなたは試すことができ 、すべて削除し、モジュールをナビゲートするために「管理者/コンテンツ/ delete_content」とあなたが特定のコンテンツタイプに属するコンテンツの削除用のフォームが表示されます。

よろしく



0

このモジュールは、サイトからすべてのコンテンツやユーザーを削除するために使用されます。これは主に開発者ツールであり、いくつかの場合に役立ちます

https://www.drupal.org/project/delete_all

一括削除モジュールは、バッチAPIを使用して特定のノードタイプのノードを削除します。少数のノードに対してViews Batch Operationsモジュール(VBO)を使用することをお勧めします。ただし、10.000ノードを削除する必要がある場合は、このモジュールの方が適している可能性があります。

https://www.drupal.org/project/bulkdelete


0

コンテンツタイプのすべてのノードをプログラムで削除するには、次のヘルパー関数を使用します。


function _delete_all_nodes_of_type($type = '') {
  // Return all nids of nodes of type.
  $nids = db_select('node', 'n')
    ->fields('n', array('nid'))
    ->condition('n.type', $type)
    ->execute()
    ->fetchCol(); // returns an indexed array
  if (!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(format_plural(count($nids), count($nids) . ' node Deleted.', count($nids) . ' nodes Deleted.'));
  }
}


-1

私はdb_deleteを使用することになりました。モジュールは必要ありません。

<?php
  db_delete('node')
    ->condition('type', 'MY_CONTENT_TYPE')
    ->execute();
?>

編集/警告:以下のBerdirのコメントを参照してください。このメソッドは、ノードに関連するすべてのデータをクリーンアップしません。


3
このアプローチの問題は、他のモジュールも反応して情報を削除できないことです。コンテンツタイプに応じて、そのノードのcontent_typeテーブルには、ノード固有の情報、フィールド、分類法(実際にはフィールドも)、コメントなどがあります。そのため、データベース内に多くの古い情報が存在することになります。
ベルディール

@Berdir-興味深い。ノードを削除するより良い組み込み方法はありますか?
グレッグ

3
node_delete()およびnode_delete_multiple()があります。tim.plunketの回答を参照してください。ただし、数千のノードを処理するようには設計されていません。api.drupal.org/ api / drupal / modules-- node-- node.module / functionを参照してください。 /…。すべてのノードをロードしてから、単一のリクエストでそれらを繰り返します。そのため、数百または数千のノードを削除する場合は、bulkdeleteなどのcontribモジュールを使用する必要があります。
ベルディール

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.