Como excluir todos os nós de um determinado tipo de conteúdo?

31

Eu tenho vários milhares de nós de um tipo de conteúdo específico. Usando a interface da web (exemplo.com/admin/content), só posso excluir cerca de 50 por vez. Como posso excluí-los rapidamente?

Greg
fonte

Respostas:

32

Existe um módulo para isso (TM).

Consulte Excluir em massa .

Isso usará a API do Lote para excluir os nós para evitar problemas de tempo limite ou memória ao excluir milhares de nós com uma única chamada para node_delete_multiple ().

A exclusão em massa é um módulo abandonado. Veja para alternativas:

Berdir
fonte
Uau, eu perdi completamente este. Boa descoberta.
9117 Greg Greg
4
Um outro método, que poderia ser útil se você está fazendo mais do que um simples filtro tipo de conteúdo, é usar Visualizações Bulk Operações: drupal.org/project/views_bulk_operations
geerlingguy
O módulo Excluir em massa foi abandonado agora. É recomendável usar o Views Bulk Operations.
Refineo 13/12/11
26

Observando o módulo Devel Generate em busca de inspiração, aqui está sua função "matar conteúdo" 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))));
  }
}

Então, eu tentaria usar o Devel Generate para excluir todos os nós, mas não criar novos, ou usar example.com/devel/php para chamar devel_generate_content_kill(array('node_types' => array('my_node_type')));diretamente.

tim.plunkett
fonte
17

No Drupal 8, uma maneira é usar o método entityQuery () com o método EntityStorageInterface :: delete () :

$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);

Se você precisar aplicar outros filtros / condições, verifique a página da interface QueryInterface

EDIT (Por outro lado, graças a @ 4k4 ):

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadByProperties(["type" => "YOUR_CONTENT_TYPE_NAME"]);
$storage_handler->delete($entities);

Se você deseja testar o código, pode usar:

drush php-eval '$storage_handler = \Drupal::entityTypeManager()->getStorage("node"); $entities = $storage_handler->loadByProperties(["type" => "article"]); $storage_handler->delete($entities);'

Isso excluirá todos os seus artigos.

Adrian Cid Almaguer
fonte
Isso não está correto, delete () espera entidades carregadas, não IDs, que é o que a consulta de entidade retorna. Em vez de um resultado $ não descritivo, use $ ids ou $ nids e, em seguida, $ storage-> delete ($ storage-> load ($ ids)).
Berdir
@Berdir obrigado, testarei o código novamente, talvez esse problema tenha sido introduzido em uma edição #
Adrian Cid Almaguer
@Berdir Atualizo a resposta e testo o código e ele funciona, o problema foi introduzido em uma edição.
Adrian Cid Almaguer
2
@AdrianCidAlmaguer, você pode substituir a consulta por$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
4k4 30/12/16
1
Utilizado recentemente em um gancho de atualização, vale a pena notar que, se você usar entityQuery , defina o accessCheckna declaração. Caso contrário, se você executá-lo em drush, por padrão accessCheck é definido como true e quaisquer nós aos quais o uid 0 não tem acesso não serão retornados.
AWM
13

Se você quiser fazer isso exclusivamente através da interface do usuário, poderá usar o módulo devel_generate.

  1. Navegue até o menu "Gerar conteúdo" em "Configuração" (admin / config / development / generate / content).
  2. Selecione os tipos de conteúdo que você deseja excluir.
  3. Verifique se a caixa de seleção ao lado de "Excluir todo o conteúdo desses tipos de conteúdo antes de gerar novo conteúdo" está marcada.
  4. Defina o número de nós que você deseja gerar para "0".

Dessa forma, nenhum nó será gerado e todos os nós dos tipos selecionados serão excluídos.

areynolds
fonte
10

Crie um arquivo com o código abaixo na raiz da instalação do drupal e execute o arquivo.

<?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);
  }
?>
Satya
fonte
1
db_fetch_object não faz parte da API do banco de dados D7.
ya.teck
10

Você pode fazer isso no Drupal 7 usando a parte Executar código PHP do módulo Devel, digitando:

$result= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'TYPE'");
foreach ($result as $record) {
  node_delete($record->nid);
}
Colin Shipton
fonte
1
Isso será executado muito lentamente, se você precisar excluir milhares de nós, é melhor usar um método que use a API em lote, como o VBO.
abielefeldt
6

Faça isso no terminal, se você usar Drush e excluir todos os módulos:

 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
shrish
fonte
5

Visualizações As operações em massa fornecem uma tela de administração de nó configurável e habilitada para BatchAPI que permite filtrar por tipo, seleção de todos os nós que correspondem aos seus critérios de pesquisa, etc.

Essa é a minha solução prática no Drupal 6 - além da exclusão em lote, você pode editar nós em massa e fazer várias outras coisas.

Parece que a versão do Drupal 7 ainda não está pronta - mas eu estaria assistindo esse módulo para um lançamento do D7.

Darren Petersen
fonte
4

Outro trecho é:

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

onde TO_BE_DELETEDé o tipo de conteúdo a ser excluído.

Tangurena
fonte
3
Note-se que funciona apenas para o Drupal 4.6, 5 e 6. A versão do Drupal 7 édb_delete('node')
Greg
4

Com o módulo Devel, usando drush:

drush genc 0 --types=article --kill

Ou na interface do usuário, conforme explicado aqui: http://befused.com/drupal/delete-nodes-devel

sunzu
fonte
É o submódulo Devel devel_generateque precisa ser ativado. E para vários tipos de que édrush genc 0 --kill --types="article, page"
leymannx
3

Eu uso Delete all module, ele funciona bem com o D8 e fornece comandos drush muito úteis. Por exemplo, para excluir todo o articleconteúdo do tipo de conteúdo:

drush delete-all article  
gerzenstl
fonte
Isso funciona com o D8? Ativei o módulo, mas recebo O comando drush 'delete-all article' não pôde ser encontrado. Eu também limpar o cache Drush
Yassin Tahtah
1

Você pode tentar Excluir todos os módulos, navegar para 'admin / content / delete_content' e você receberá um formulário para excluir o conteúdo pertencente a determinados tipos de conteúdo.

Saudações

OV
fonte
0

Este módulo é usado para excluir todo o conteúdo e / ou usuários de um site. Esta é principalmente uma ferramenta de desenvolvedor, que pode ser útil em vários casos

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

assim como o módulo Excluir em Massa excluirá todos os nós de um determinado tipo de nó usando a API do lote. É recomendável usar o módulo Views Batch Operations (VBO) para um pequeno número de nós. Mas se você precisar excluir 10.000 nós, este módulo poderá ser uma opção melhor.

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

onlink
fonte
0

Exclua todos os nós do tipo de conteúdo programaticamente, aqui está uma função auxiliar:


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.'));
  }
}

berramou
fonte
-1

Acabei usando db_delete , nenhum módulo necessário:

<?php
  db_delete('node')
    ->condition('type', 'MY_CONTENT_TYPE')
    ->execute();
?>

Editar / Aviso: Veja o comentário de Berdir abaixo. Este método não limpa todos os dados relacionados aos nós.

Greg
fonte
3
O problema com essa abordagem é que outros módulos não são capazes de reagir e excluir suas informações também. Dependendo do tipo de conteúdo, há informações específicas do nó na tabela content_type desse nó, campos, taxonomias (também um campo, na verdade), comentários e assim por diante. Então, você pode acabar com muitas informações obsoletas no seu banco de dados.
Berdir
@Berdir - Interessante. Existe uma maneira interna melhor de excluir nós?
9788 Greg
3
Há node_delete () e node_delete_multiple (), consulte a resposta de tim.plunket, mas que não foi projetada para lidar com milhares de nós, consulte api.drupal.org/api/drupal/modules--node--node.module/function / ... . Ele carrega todos os nós e itera sobre eles em uma única solicitação. Então, praticamente, é necessário usar um módulo de contribuição, como bulkdelete, se você deseja excluir centenas ou milhares de nós.
Berdir 9/03/11
-1

Se você não quiser codificar, e você pode experimentar este módulo, https://drupal.org/project/total_control

Vá para Painel -> Conteúdo, selecione todo o conteúdo (você pode filtrar por tipo de conteúdo) e selecione "Excluir item"

user9869932
fonte