Drush를 사용하여 지정된 컨텐츠 유형의 노드를 삭제할 수 있습니까?


13

Drush가 주어진 컨텐츠 유형의 노드를 삭제할 수 있는지 궁금합니다.

다음과 같은 것 : $ drush delete-node --type=MyContentType

가능하지 않다면 그런 방법을 만들 수 있습니까?

답변:


4

다음과 같은 함수를 작성할 수 있습니다.

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 방법을 올바르게 추가하는 방법을 보여줍니다.
chefnelone 2016 년

예! 읽어보기에는 구현할 수있는 여러 가지 방법이 있습니다!
Chapabu 2016 년

21

devel 모듈을 설치하고 drush를 사용하여 모든 노드를 삭제하십시오.

$  drush genc --kill 0 0 

유형 옵션을 제공 할 수도 있습니다.

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

영리한, 나는 그것을 좋아한다.
m4olivei

3
이것은 D8에서 작동합니다. 이 devel_generate모듈은 devel에 포함되어 있지만 drush en devel_generate 일반적으로 genc를 사용하여 활성화해야 노드 를 만드는 데 사용 되므로 끝에 0 0은 새로운 것을 만들지 말고 이미 존재하는 것을 제거하라는 --kill을 알려줍니다.
윌리엄 터렐

15

아래 명령을 사용하여 할 수 있다고 생각합니다

drush node_delete <nid>

편집 : 질문과 관련이있는 모듈을 찾았습니다.

http://drupal.org/project/delete_all

용법

돌진

drush delete-all

예: drush delete-all article


콘텐츠 유형별로 모든 노드를 삭제하려고했습니다.
chefnelone 2016 년

이 모듈을 사용해 보셨습니까 drupal.org/project/delete_all 사용법 Drush drush delete-all 예 : drush delete-all article
ninjascorner 2016 년

drush node_delete <nid> 명령을 어디에서 찾을 수 있습니까?
Adrian Cid Almaguer

2016 년 12 월 현재, 사람들의 시간을 절약하기 위해 delete_all Drupal 8로 포팅되지 않았지만 genc answer가 작동합니다.
윌리엄 터렐


5

이와 같은 것이 작동합니다 (예상되지 않음).

$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를 사용하면 모든 적절한 후크가 실행됩니다. 특히 노드 개정 및 필드 데이터 (및 개정)도 삭제되므로 데이터베이스에 분리 된 데이터가 없습니다.


5

이 글타래에 대한 좋은 아이디어가 있습니다. 실제로 프로그래밍을하고 싶지 않고 Drush를 사용하려면 Delete All 기여 모듈을 볼 수 있습니다 .

돌진
삭제 모두 삭제
예 : 기사 전체 삭제

Drupal 7 버전의 Drush

모든 노드, 특정 컨텐츠 유형의 노드 또는 사용자를 삭제하십시오.

예 :
 drush delete-all article 모든 기사 노드를 무시합니다.
 drush delete-all all 모든 유형의 노드를 삭제합니다.
 drush delete-all --reset 모든 유형의 노드를 삭제하고 노드, 개정 및 주석 카운터를 재설정합니다.
 drush delete-all users 사용자를 삭제하십시오.

옵션 :
 --reset 노드, 개정 및 주석 테이블의 재설정 카운터.
 -역할은 역할을 선택합니다

별칭 : da

4

VBO에는 Drush 통합 기능이 있습니다. 노드에 대한 VBO보기를 작성하고 Drush (을 사용하여 drush vbo-execute) 를 통해 실행 하고 노드 유형을 인수로 전달하십시오.


나는 이것이 내가 필요한 것이라고 생각한다. 단지 두 가지 질문 : 뷰를 실행하는 drush 방법은 무엇입니까? 그리고이 방법이 브라우저에서보기를 실행하는 것보다 빠릅니까?
chefnelone 2016 년

정확한 drush 명령을 지정하기 위해 답을 편집했습니다. 그리고 예, 뷰가 렌더링되지 않기 때문에 더 빠릅니다.
Bojan Zivanovic 2016 년

1

drush 스크립트를 생성 할 수도 있습니다 ( "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 

문서 : 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?
Елин Й.

유형과 같은 예입니다.
Mauro Mascia

그러나 원래 포스터는 그러한 조건에 대해 언급하지 않았으므로 예제가 관련이 없으므로 오해의 소지가 있다고 생각합니다.
Елин Й.

1

드루팔 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);

1

특정 컨텐츠 유형의 모든 노드를 삭제하려면 drush를 통해 다음 명령을 실행하십시오.

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

여기서 MyContentType은 시스템 컨텐츠 유형 이름 (예 : 페이지)입니다.


1

개별 노드의 경우 :

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

rush-php-eval
부트 스트랩 후 임의의 PHP 코드를 평가합니다 Drupal


품질이 낮은 답변으로 간주 될 수 있으므로 코드를 설명하는 자세한 내용을 추가하십시오 (따라서 조정을 통해 삭제 될 수 있음).
Pierre.Vriens

1

@kenorb에서 제공 한 답변을 업데이트합니다.

드루팔 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

0

당신이 사용할 수있는

drush node_delete NID 특정 노드를 삭제하지만 콘텐츠 유형별로 모든 노드를 삭제하려면 배치 API를 사용하여 drush 플러그인을 만들 수 있습니다.


drush node_delete NID 명령을 찾을 수 없습니다.
Adrian Cid Almaguer

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.