Drushで特定のコンテンツタイプのノードを削除できますか?


14

Drushが特定のコンテンツタイプのノードを削除できるかどうか疑問に思っています。

何かのようなもの: $ drush delete-node --type=MyContentType

不可能な場合、そのようなメソッドを作成できますか?

回答:


5

次のような関数を作成できます。

function MYMODULE_delete_all_the_things() {
  $query = new EntityFieldQuery;

  $result = $query->entityCondition('entity_type', 'node')
    ->propertyCondition('type', 'YOUR-CONTENT-TYPE')
    ->execute();

  if (isset($result['node']) && count($result['node'])) {

    $node_ids = array_keys($result['node']);

    node_delete_multiple($node_ids);
  }
}

注-単純なSELECTクエリを使用することもできますが、エンティティを操作しているように見えるため、EntityFieldQueryを使用する方が賢明で一般的です

これは、引数の変更や追加も非常に簡単でなければなりません。Drushコマンドに簡単に配置することもできます -Drush リポジトリでこれを行う方法の例があります(下部にある[コマンド]セクションを確認してください)。


リポジトリリンクが、drushメソッドを適切に追加する方法を示しているように聞こえます。
チェフネロン

うん!READMEには、それらを実装する方法もいくつかあります。
チャパブ

22

develモジュールをインストールし、drushを使用してすべてのノードを削除します。

$  drush genc --kill 0 0 

タイプオプションを指定することもできますが、

$  drush genc --kill --types=article 0 0

賢い、私はそれが好きです。
m4olivei 14

3
これはD8で機能します。devel_generateモジュールはdevelのに含まれていて有効にする必要がありdrush en devel_generate GENCは正常にするために使用されて作成最後に0がすでに何取り除くために何か新しいもの、と--killを作成しないことを言っているので、ノードを。
ウィリアムタレル

16

以下のコマンドを使用するとできると思います

drush node_delete <nid>

編集:質問に関連する/関連するモジュールを見つけました

http://drupal.org/project/delete_all

使用法

ブラシ

drush delete-all

例: drush delete-all article


コンテンツタイプごとにすべてのノードを削除するつもりでした。
チェフネロン

このモジュールを試しましたかdrupal.org/project/delete_all 使用法Drush drush delete-all例:drush delete-all記事
-ninjascorner

drush node_delete <nid>コマンドはどこにありますか?
エイドリアンシドアルマグエル

2016年12月現在、時間を節約するために、delete_all Drupal 8にはまだ移植されていませんが、gencの回答は機能します。
ウィリアムタレル

6

次のようなものが動作します(テストされていません):

$query = new EntityFieldQuery();

$entities = $query->entityCondition('entity_type', 'node', '=')
  ->entityCondition('bundle', 'Announcements')
  ->execute();

$nids = array_keys($entities['node']);

node_delete_multiple($nids);

これにより、Annoucementsを使用してコンテンツタイプを持つすべてのノードが検索されますEntityFieldQuery()。次に$nids、結果からすべてを取得し、を使用してそれらを削除しますnode_delete_multiple()

このコードを取得して、別のPHPファイルに配置し、で実行できますdrush scr

APIを使用すると、すべての適切なフックが起動します。特に、ノードリビジョンとフィールドデータ(およびそれらのリビジョン)も削除されるため、データベースに孤立したデータがありません。


6

このスレッドにはいくつかの良いアイデアがあります。本当にプログラミングをしたくなく、Drushを使用したい場合は、投稿されたすべて削除モジュールをご覧ください。

ブラシ
全削除
例:全記事削除

Drupal 7バージョンのDrush

すべてのノード、特定のコンテンツタイプのノードまたはユーザーを削除します。

例:
 dash delete-all articleすべての記事ノードを削除します。
 drush delete-all allすべてのタイプのノードを削除します。
 drush delete-all --resetすべてのタイプのノードを削除し、ノード、リビジョン、コメントカウンターをリセットします。
 すべてのユーザーを削除するユーザーを削除します。

オプション:
 --resetノード、リビジョン、コメントテーブルのカウンタをリセットします。
 -役割は役割を選ぶ

エイリアス:da

5

VBOにはDrushが統合されています。ノードのVBOビューを作成し、Drushを使用して(を使用してdrush vbo-execute)実行し、ノードタイプを引数として渡します。


私はこれが私が必要とするものだと思います。ちょうど2つの質問:ビューを実行するためのdrushメソッドはどれですか?そして、この方法はブラウザでビューを実行するよりも高速ですか?
-chefnelone

答えを編集して、正確なdrushコマンドを指定しました。はい、この方法ではビューがレンダリングされないため、高速になります。
ボヤンジバノビッチ


2

ブラシスクリプトを作成することもできます(「bulk_delete.php」と呼ばれ、Drupalルートフォルダーの下に配置されているとしましょう)。

#!/usr/bin/env drush

$res = db_delete('node')
  ->condition('type', 'mycontenttype', '=')
  ->execute();

echo "deleted:" . $res;

これは絶対に最速の方法です。Drupalの関数db_deleteを使用したdbへの直接クエリ

使用法:

:~# cd /var/www/www.mysite.com
:~# drush --uri=www.mysite.com scr bulk_delete.php 

Doc:https : //api.drupal.org/api/drupal/includes!database!database.inc/function/db_delete/7

警告:このプロセスでは、フィールドのデータは削除されません。とにかく、これらのフィールドに同じプロセスを適用できます(各フィールドの「バンドル」列を見てください)。例えば:

#!/usr/bin/env drush

$field_tables = array(
  'field_data_field_body',
  'field_data_field_mycoolfield',
  'field_revision_body',
  'field_revision_field_mycoolfield'
);

foreach ($field_tables as $field_table) {
  $res = db_delete($field_table)
    ->condition('bundle', 'mycontenttype', '=')
    ->execute();

  echo "deleted:" . $res . "\n\n";
}

ここで、「mycontenttype」は最初のクエリで使用されるものです。


なぜ状態なの'nid' > 5000か?
ЕлинЙ.

タイプのような例です。
マウロマスシア

しかし、元のポスターはそのような状態について言及していないので、この例は無関係であり、誤解を招くと思います。
ЕлинЙ.

2

Drupal 7

次のワンライナーを試してください。DrupalからすべてのMyContentTypeノードが削除されます。

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

または、エンティティタイプ名(ノードなど)に基づいてすべてのエンティティを削除できます。

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

注:nodeエンティティタイプ名です。必要に応じて変更できます。


メモリまたはタイムアウトエラーが発生する場合は、次のセットを直前に追加できます$res

ini_set('memory_limit', -1); ini_set('max_execution_time', 0);

2

特定のコンテンツタイプのすべてのノードを削除するには、drushを使用して次のコマンドを実行します。

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

MyContentTypeは、マシンのコンテンツタイプ名(Pageなど)です。


2

個々のノードの場合:

$ drush php-eval 'node_delete($node->nid);'

drush php-eval
Drupalのブートストラップ後に任意のphpコードを評価します


コードを説明するためにいくつかの詳細を追加してください。これは低品質の回答と見なされる可能性があります(したがって、モデレートによって削除される可能性があります)。
-Pierre.Vriens

1

使用できます

drush node_delete NID 特定のノードを削除しますが、コンテンツタイプごとにすべてのノードを削除する場合は、バッチAPIを使用してDrushプラグインを作成できると思います。


drush node_delete NIDコマンドが見つかりません。
エイドリアンシドアルマグエル


1

@kenorbが提供する回答を更新します。

Drupal 8で

drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'

drush ev '$ type =' \ '' node '\' '; entity_delete_multiple($ type、\ Drupal :: entityQuery($ type)-> execute()); '
オタク

既存の回答を更新するには、コメントをドロップして編集を提案してください。
-leymannx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.