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?

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).


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

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


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.


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

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.


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


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.


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

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).


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


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

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.


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

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.