Posso excluir nós de um determinado tipo de conteúdo com o Drush?

13

Basta saber se o Drush é capaz de excluir nós de um determinado tipo de conteúdo.

Algo como: $ drush delete-node --type=MyContentType

Se não for possível, posso criar um método como esse?

chefnelone
fonte

Respostas:

4

Você pode criar uma função da seguinte maneira:

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

Nota - Você também pode usar uma SELECTconsulta simples , mas, ao trabalhar com entidades, parece mais sensato / prática comum usar o EntityFieldQuery .

Também deve ser muito fácil alterar ou adicionar argumentos. Você também pode colocá-lo em um comando Drush com bastante facilidade - há um exemplo de como fazer isso no repositório Drush (verifique a seção Comandos na parte inferior).

Chapabu
fonte
Entendo, parece que o link do repositório mostra como adicionar corretamente um método drush.
chefnelone
Sim! O leia-me tem algumas maneiras diferentes de implementá-las também!
Chapabu
21

Instale o módulo devel e use drush para excluir todos os nós,

$  drush genc --kill 0 0 

Você também pode dar uma opção de tipo,

$  drush genc --kill --types=article 0 0
ericj
fonte
Inteligente, eu gosto.
M4olivei
3
Isso funciona com o D8. O devel_generatemódulo está incluído no devel, mas precisa ser ativado com o drush en devel_generate genc normalmente é usado para criar nós, então o 0 0 no final está dizendo para não criar nada de novo, e o --kill para remover o que já existe.
William Turrell
15

Eu acho que você pode usando o comando abaixo

drush node_delete <nid>

EDIT: Encontrou um módulo que faz algo / relacionado à pergunta

http://drupal.org/project/delete_all

Uso

Drush

drush delete-all

Exemplo: drush delete-all article

ninjascorner
fonte
Eu pretendia excluir todos os nós por tipo de conteúdo.
chefnelone
Você tentou este módulo drupal.org/project/delete_all Uso Drush Drush apagar-all Exemplo: Drush apagar-all artigo
ninjascorner
onde posso encontrar o comando drush node_delete <nid>?
Adrian Cid Almaguer
Para economizar tempo das pessoas, em dezembro de 2016, delete_all ainda não foi portado para o Drupal 8 , mas a resposta genc funciona.
William Turrell
5

Algo assim funcionaria (não testado):

$query = new EntityFieldQuery();

$entities = $query->entityCondition('entity_type', 'node', '=')
  ->entityCondition('bundle', 'Announcements')
  ->execute();

$nids = array_keys($entities['node']);

node_delete_multiple($nids);

Isso encontrará todos os nós com o tipo de conteúdo Annoucementsusando EntityFieldQuery(). Em seguida, obtém todo o $nidsresultado e os exclui usando node_delete_multiple().

Você pode pegar esse código, colocá-lo em um arquivo PHP separado e executá-lo com drush scr.

O uso da API garantirá que todos os ganchos adequados sejam acionados. Entre outras coisas, eles também excluirão as revisões do nó e os dados do campo (e suas revisões) para que você não tenha dados órfãos no banco de dados.

mpdonadio
fonte
5

Existem algumas boas idéias sobre este tópico. Se você realmente não deseja fazer nenhuma programação e deseja usar o Drush, pode consultar o módulo contribuído Excluir tudo :

Drush
drush excluir tudo
Exemplo: drush delete-all article

Drush na versão Drupal 7

Exclua todos os nós, nós de um tipo ou usuários de conteúdo específico.

Exemplos:
 drush delete-all article Exclua todos os nós do artigo.
 drush delete-all all Excluir nós de todos os tipos.
 drush delete-all --reset Exclui nós de todos os tipos e redefine os contadores de nós, revisões e comentários.
 drush delete-all users Exclua usuários.

Opções:
 --reset Redefine o contador para tabelas de nó, revisão e comentário.
 --roles escolhem papéis

Aliases: da
tenken
fonte
4

VBO tem integração Drush. Crie uma visualização VBO dos nós, execute-a via Drush (usando drush vbo-execute), passe o tipo de nó como argumento.

Bojan Zivanovic
fonte
Eu acho que é disso que preciso. Apenas 2 perguntas: Qual é o método drush para executar uma exibição? e Esse método será mais rápido do que executar a exibição no navegador?
chefnelone
Editou a resposta para especificar o comando drush exato. E sim, será mais rápido, pois assim a visualização não é renderizada.
Bojan Zivanovic 15/06/12
4

Drush 9

drush entity:delete node --bundle=my_content_type

Denis Viunyk
fonte
2
Melhor resposta hoje em dia!
18719 Jonathan
1

Você também pode criar um script drush (digamos que seja chamado "bulk_delete.php" e seja colocado na pasta raiz do Drupal):

#!/usr/bin/env drush

$res = db_delete('node')
  ->condition('type', 'mycontenttype', '=')
  ->execute();

echo "deleted:" . $res;

Esta é absolutamente a maneira mais rápida de fazer isso: uma consulta direta ao banco de dados, usando a função do Drupal db_delete

Uso:

:~# cd /var/www/www.mysite.com
:~# drush --uri=www.mysite.com scr bulk_delete.php 

Doc: https://api.drupal.org/api/drupal/includes!database!database.inc/function/db_delete/7

Aviso: este processo não exclui os dados de seus campos. De qualquer forma, o mesmo processo pode ser aplicado a esses campos (observando a coluna "pacote configurável" de cada campo). Por exemplo:

#!/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";
}

Onde "mycontenttype" é o usado na primeira consulta.

Mauro Mascia
fonte
Por que a condição 'nid' > 5000?
Елин Й.
é um exemplo, como o tipo.
Mauro Mascia
Mas o pôster original não menciona essa condição; é por isso que acho que o exemplo é irrelevante e, portanto, enganoso.
Елин Й.
1

Drupal 7

Experimente o seguinte linux, ele remove todos os nós MyContentType do Drupal:

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

Ou você pode remover todas as entidades com base no nome do tipo de entidade (por exemplo, nó):

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

Nota: nodeé o nome do tipo de entidade, você pode alterá-lo, se necessário.


Se você receber erros de memória ou de tempo limite, adicione os seguintes conjuntos imediatamente antes do $res:

ini_set('memory_limit', -1); ini_set('max_execution_time', 0);
kenorb
fonte
1

Para excluir todos os nós de um tipo de conteúdo específico, tente executar o seguinte comando via drush:

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

Onde MyContentType é o nome do Tipo de Conteúdo da sua máquina (por exemplo, Página).

kenorb
fonte
1

Para nós individuais:

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

drush php-eval
Avalie o código php arbitrário após a inicialização do Drupal

edmitry
fonte
Adicione mais alguns detalhes para explicar seu código, sem que isso possa ser considerado uma resposta de baixa qualidade (e, portanto, pode ser excluído por moderação).
Pierre.Vriens
1

Atualizando a resposta fornecida por @kenorb.

No Drupal 8

drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'
Jason Yarrington
fonte
drush ev '$ type =' \ '' nó '\' '; entity_delete_multiple ($ type, \ Drupal :: entityQuery ($ type) -> execute ()); '
Geek-merlin #
Para atualizar uma resposta existente, envie um comentário para sugerir uma edição.
Leymannx # 18/18
0

Você pode usar

drush node_delete NID para excluir um nó específico, mas se você deseja excluir todos os nós por tipo de conteúdo, acho que você pode criar um plugin drush usando a API do lote.

user8012
fonte
Não consigo encontrar o comando NID drush node_delete.
Adrian Cid Almaguer
0

Você também pode fazer isso com o módulo devel, conforme respondido em Posso excluir nós de um determinado tipo de conteúdo com o Drush?

Instale o módulo devel e use drush para excluir todos os nós,

$ drush genc --kill 0 0

Você também pode dar uma opção de tipo,

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

wranvaud
fonte