주어진 컨텐츠 유형의 모든 노드를 삭제하는 방법?


31

특정 콘텐츠 유형의 수천 노드가 있습니다. 웹 인터페이스 (example.com/admin/content)를 사용하면 한 번에 약 50 개만 삭제할 수 있습니다. 어떻게 빨리 삭제할 수 있습니까?

답변:


32

이를위한 모듈이 있습니다 (TM).

대량 삭제를 참조하십시오 .

node_delete_multiple ()을 한 번 호출하여 수천 개의 노드를 삭제할 때 시간 초과 또는 메모리 문제를 피하기 위해 배치 API를 사용하여 노드를 삭제합니다.

대량 삭제는 버려진 모듈입니다. 대안을보십시오 :


와우, 나는 이것을 완전히 놓쳤다. 잘 찾았어요
Greg

4
간단한 컨텐츠 유형 필터보다 더 많은 작업을 수행하는 경우 유용 할 수있는 또 다른 방법은 Views Bulk Operations를 사용하는 것입니다. drupal.org/project/views_bulk_operations
geerlingguy

대량 삭제 모듈이 현재 폐기되었습니다. 뷰 대량 작업을 사용하는 것이 좋습니다.
Refineo

26

영감을 얻기 위해 Devel Generate 모듈을 살펴보면 "content kill"기능이 있습니다 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 에서 EntityStorageInterface :: delete () 메소드 와 함께 entityQuery () 메소드를 사용하는 방법이 있습니다 .

$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))를 사용하십시오.
Berdir

@Berdir 덕분에, 나는 어쩌면이 문제가 하나의 편집에 도입 된, 코드를 다시 테스트합니다
아드리안 시드 Almaguer

@ Berdir 나는 대답을 업데이트하고 코드를 테스트하고 작동하며 문제는 한 번의 편집으로 소개되었습니다.
Adrian Cid Almaguer

2
@AdrianCidAlmaguer, 당신은 함께 쿼리를 대체 할 수$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
4k4

1
최근에 업데이트 훅에서 이것을 사용했다면, 사용 entityQuery 하면 accessCheckon을 설정해야한다는 점에 주목할 가치가 있습니다 . 그렇지 않으면 drush에서 실행하면 기본적으로 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')
Greg

4

drush 모듈을 사용하여 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"
leymannx

3

모든 모듈 삭제를 사용 하며 D8과 잘 작동하며 매우 유용한 drush 명령을 제공합니다. 예를 들어, article컨텐츠 유형 의 모든 컨텐츠를 삭제하려면 다음을 수행하십시오 .

drush delete-all article  

D8에서도 작동합니까? 모듈을 활성화했지만 drush 명령 'delete-all article'을 찾을 수 없습니다. 나는 또한 drush cache를 지웠다
Yassin Tahtah

1

모든 모듈 삭제 를 시도 하고 'admin / content / delete_content'로 이동하면 특정 컨텐츠 유형에 속하는 컨텐츠를 삭제하기위한 양식이 표시됩니다.

문안 인사



0

이 모듈은 사이트에서 모든 컨텐츠 및 / 또는 사용자를 삭제하는 데 사용됩니다. 이것은 주로 개발자 도구이며 여러 경우에 유용 할 수 있습니다

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

일괄 삭제 모듈은 배치 API를 사용하여 특정 노드 유형의 모든 노드를 삭제합니다. 적은 수의 노드에는 VBO (Views Batch Operations) 모듈을 사용하는 것이 좋습니다. 그러나 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

@ Berdir-흥미 롭습니다. 노드를 삭제하는 더 나은 기본 제공 방법이 있습니까?
Greg

3
node_delete () 및 node_delete_multiple ()이 있습니다. tim.plunket의 답변을 참조하십시오.하지만 수천 개의 노드를 처리하도록 설계되지 않았습니다. api.drupal.org/api/drupal/modules--node--node.module/function 참조 / ... . 모든 노드를로드 한 다음 단일 요청으로 노드를 반복합니다. 따라서 수백 또는 수천 개의 노드를 삭제하려면 bulkdelete와 같은 contrib 모듈을 사용해야합니다.
Berdir

-1

대구하지 않으려면이 모듈을 사용해보십시오 : https://drupal.org/project/total_control

대시 보드-> 컨텐츠로 이동하여 모든 컨텐츠를 선택하고 (컨텐츠 유형별로 필터링 할 수 있음) "항목 삭제"를 선택하십시오.

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