1600 명의 사용자와 2500 개의 게시물을 삭제하는 방법?


10

몇 년 전에 Drupal 6.9로 사이트를 구성한 후 잊어 버렸습니다. 모든 스팸 발송자 인 160 페이지의 사용자가 있고 3 개를 제외한 모든 사용자를 삭제해야합니다. 한 번에 한 페이지 씩이 작업을 수행하면 MySQL 호출로 인해 속도가 느려집니다. 또한 약 2500 개의 포럼 게시물을 삭제해야합니다.

데이터베이스에서 직접 레코드를 삭제하는 것이 약간 두렵습니다.

"대량 삭제"라는 모듈을 보았지만 Drupal 버전 5 용이며 버전 6에서는 사용할 수 없습니다.

답변:


17

노드, 사용자, 주석에 대해 대량 작업을 실행할 수있는 모듈 인 Views Bulk Operations를 사용할 수 있습니다 . 또한 Batch API를 사용하여 선택된 작업을 모든 노드, 사용자 또는 주석에 적용 할 수 있습니다 . 배치 API를 사용하면 여러 페이지 요청에 걸쳐 양식 처리를 분산시킬 수 있으므로 PHP 시간 초과로 인해 처리가 중단되지 않고 사용자는 진행중인 작업의 진행 상황에 대한 피드백을받을 수 있습니다.


1
삭제할 모든 항목을 선택하면 다시 한 번 고통스럽게 느려집니다.보기의 VBO 옵션에는 select all모든 페이지에서 모든 항목을 선택 하는 버튼 을 활성화하는 설정이 있습니다. 클릭하고 모두 죽여라!
AyeshK

3

노드를 죽이는이 방법은 매우 느리지 만 가장 안전합니다

function MYMODULE_menu(){
  $items['admin/mymodule/killnodes/%'] = array(
      'title' => 'Kill nodes',
      'page callback' => 'kill_nodes',
      'page arguments' => array(3),
      'type' => MENU_CALLBACK,
      'access arguments' => array('administer site configuration'),
  );
  return $items;
}

function kill_nodes($type){
  $query = "SELECT node.nid AS nid FROM {node} node WHERE node.type IN ('%s')";
  $result = db_query($query, $type);
  $count = 0;
  while($row = db_fetch_object($result)){
    node_delete($row->nid);
    $count++;
  }
  $message = t('!count nodes has been killed. Pif-Paf!', array('!count' => $count));
  drupal_set_message($message);
  return t("That's all folks");
}

사용자의 경우 제거하려는 사용자를 프로그래밍 방식으로 결정할 수 있습니까? 가능하면 이전 기능을 예로 사용하여 원하지 않는 사용자를 제거 할 수 있습니다.


3
시간이 초과되지 않도록 Batch API 배치로 래핑하는 것이 좋습니다.
Decipher

확실 해요 간단한 예입니다.
dobeerman


2

나처럼 파이썬 접근 방식을 선호한다면 (아마도 희귀하지만 여전히)이 문제를 해결하는 투명하고 효과적인 방법입니다.

import os

# Build up a variable containing the usernames
# This list was built using drush sql-cli, then
# SELECT name FROM users 
#   where $your-where-condition 
#   order by uid asc 
#   INTO 
#     OUTFILE '/tmp/users.csv' 
#     FIELDS TERMINATED BY ',' 
#     ENCLOSED BY '"' 
#     lines terminated by ', ' ;
users = [result from SQL goes here]

for user in users:
    print("Deleting spam user: %s..." % user),
    os.system('drush --yes -r $your-path-to-drupal -l $your-site-url user-cancel --delete-content %s > /dev/null' % user) 
    print 'Done'

단계는 기본적으로 다음과 같습니다.

  1. 로 DB에 로그인 drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. 자신의 where 조건으로 위의 SQL을 실행하고 결과를 users 변수에 붙여 넣습니다.
  3. drupal 경로와 사이트 이름을 drush 명령으로 업데이트하십시오.
  4. 로 스크립트를 실행하십시오. python delete-users.py

더 좋은 방법이 있다고 확신하지만 이것이 잘 작동하는 해킹 솔루션입니다.


1
당신은 이것을 하나의 라이너로도 할 수 있습니다. for i in `drush sql-query 'SELECT list of usernames'`; do drush --yes user-cancel --delete-content $i; done.
David L


1

모든 사용자 indrupal 7을 삭제하기위한 사용자 지정 모듈을 구현했습니다. 관리자 / 사람 영역에는이 작업을 완료하기위한 새로운 양식이 있습니다.

서두르다.

샌드 박스 프로젝트입니다. k

프로젝트에 연결하십시오.


1

고급 사용자 모듈을 사용하십시오 . 이 모듈은 "고급"탭을 사용자 관리 페이지에 추가합니다. 이 탭에서 모든 속성 (역할, 상태 등)별로 사용자를 필터링하고 모두를 선택할 수 있습니다. 사용자 삭제로 사용자의 삭제 방법을 선택하고 모든 컨텐츠를 제거하면 해당 사용자가 작성한 모든 컨텐츠를 삭제할 수도 있습니다.


0

Drush에 액세스 할 수 있고 사용자가 화이트리스트를 유지하도록 허용하고 추가 모듈 설치를 포함하지 않는 빠른 솔루션을 원하는 경우 :

drush @example.org sqlq "SELECT name FROM users WHERE name NOT IN ('keepthisuser1', 'andthisuser2')" | while read NAME; do
  drush -y @example.org user-cancel $NAME ; 
done

복사 붙여 넣기 전에 위의 내용 @example.org을 유지하도록 사용자 및 목록을 모두 조정하십시오. ('keepthisuser1', 'andthisuser2'):)


이것은 사용자 필드와 같은 꼬리를 남길 것입니다.
niksmac

1
당신이 의미하는 바를 자세히 설명 할 수 있습니까? 방금 최신 Drupal 7에서 이것을 테스트했으며 사용자 필드에 데이터를 남기지 않았습니다. 나는 "꼬리"의 의미를 이해하지 못한다.
Chris Burgess

1
이 답변이 위의 파이썬으로 싸인 비슷한 것을 복제하는 것을 봅니다.
Chris Burgess

1
이 답변에 대한 투표는 실제로 필요에 따라 작동하기 때문에 투표를 취소했습니다. @niksmac 변경 투표를 추천하여 투표하십시오. SQL 전용 답변이 아니며 drush를 사용합니다.
기독교

0

모두 삭제 모듈 이 유용 할 수 있습니다.

설치 한 후에는 다음과 같은 작업을 수행 할 수 있습니다.

drush delete-all articles

또는

drush delete-all users

Devupal 6의 드루팔 6 버전 :

빠른 삭제를 제외한 모든 것이 작동해야합니다.


0

원래 질문은 6이지만, Chris Burgess의 답변을 사용 하면 Drupal 8에 적용 할 수 있습니다.

drush sqlq "SELECT name FROM users_field_data WHERE name NOT IN ('admin')" | while read NAME; 
  do drush -y user:cancel --delete-content $NAME; 
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.