Como excluir 1600 usuários e 2500 postagens?


10

Há alguns anos, configurei um site com o Drupal 6.9 e esqueci. Eu tenho 160 páginas de usuários que são todos spammers e preciso excluir tudo menos 3. Fazer essa página de cada vez é dolorosamente lenta devido às chamadas do MySQL (eu acho). Eu também tenho cerca de 2500 posts no fórum para excluir.

Estou com um pouco de medo de excluir os registros diretamente do banco de dados.

Eu vi um módulo chamado "exclusão em massa", mas é para o Drupal versão 5 e não está disponível para a versão 6.

Respostas:


17

Você pode usar o Views Bulk Operations , um módulo que permite executar operações em massa em nós, usuários, comentários; também permite aplicar a operação selecionada a todos os nós, usuários ou comentários usando a API do Lote . A API em lote permite que o processamento de formulários seja espalhado por várias solicitações de página, garantindo assim que o processamento não seja interrompido devido a um tempo limite do PHP, permitindo ao usuário receber feedback sobre o andamento das operações em andamento.


1
Selecionar todos os itens a serem excluídos é dolorosamente lento - Há uma configuração nas opções de VBO do View para ativar um select allbotão que seleciona todos os itens em todas as páginas - clique nele e em Kill-em-all!
precisa saber é o seguinte

3

Essa maneira de matar nós é muito lenta, mas mais segura

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");
}

Para usuários, você pode determinar programaticamente o usuário que deseja remover? Se possível, você pode usar a função anterior como exemplo para remover usuários sem varinha.


3
Sugiro agrupar isso com um lote da API do Lote para evitar que o tempo limite se esgote.
Decifre

Com certeza. É um exemplo simples.
Dobeerman #


2

Se, como eu, você preferir uma abordagem Python (rara por aqui provavelmente, mas ainda assim), essa é uma maneira transparente e eficaz de corrigir esse problema:

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'

Os passos são basicamente:

  1. Entre no seu banco de dados com drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. Execute o SQL acima com sua própria condição where e cole os resultados na variável users.
  3. Atualize o caminho do drupal e o nome do site para o comando drush
  4. Execute o script com python delete-users.py

Tenho certeza de que há uma maneira melhor de fazer isso, mas esta é a minha solução invadida que funciona bem.


1
Você também pode fazer isso como uma linha. for i in `drush sql-query 'SELECT list of usernames'`; do drush --yes user-cancel --delete-content $i; done.
David L


1

Eu implementei um módulo personalizado para excluir todos os usuários indrupais 7. Na área admin / people, há um novo formulário para concluir esta operação.

Também com drush.

É um projeto de sandbox. Thk.

Link para o projeto.


1

Use o módulo de usuário avançado . Este módulo adiciona uma guia "avançado" à página de gerenciamento de usuários. Nessa guia, você pode filtrar os usuários por qualquer atributo (função, status etc.) e selecionar todos. Se você selecionar o método de exclusão dos usuários como excluir o usuário e remover todo o conteúdo, também poderá excluir todo o conteúdo criado por eles.


0

O módulo Excluir tudo pode ser útil.

Uma vez instalado, você pode fazer, por exemplo:

drush delete-all articles

ou

drush delete-all users

Drupal 6 versão em dev, mas a partir das notas:

Tudo deve estar funcionando, exceto a exclusão rápida.


-1

Se você tem acesso ao Drush e deseja uma solução rápida que permita manter os usuários na lista de permissões e não envolve a instalação de módulos adicionais:

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

Certifique-se de ajustar os @example.orgusuários e a lista de usuários para manter ('keepthisuser1', 'andthisuser2')os itens acima antes de copiar e colar :)


Isso deixará caudas, como campos de usuário e tudo.
Niksmac

Você pode dar detalhes do que você quer dizer? Acabei de testar isso no Drupal 7 mais recente e ele não deixou dados nos campos do usuário. Eu não entendo o que você quer dizer com "caudas".
22915 Chris

Vejo que esta resposta duplica uma resposta semelhante envolvida em Python acima.
Chris Burgess
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.