Published:
Coleção de tasks para executar no Drupal de forma iterativa Permalink
Programar no Drupal pela linha de comando de uma forma iterativa nos facilita a vida quando precisamos executar tarefas que são pontuais e que não vale a pena preparar um módulo para tal.
Formas de acesso ao Drupal cli
Você pode acessar o Drupal e programar em php iterativo usando drush ou drupal console:
drush php
# ou
drupal shellCaso use o aegir:
drush @seusite.com.br phpDump de um node
Carregando um node com nid 3 e dando um dump:
$node = \Drupal::entityTypeManager()->getStorage('node')->load(3);
dump($node)Corrigindo o formato do campo boby
Carregando todos nodes do tipo ficha e alterando o campo body->format para full_html:
$nids = \Drupal::entityQuery('node')->condition('type','ficha')->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
foreach ($nodes as $node) {
    $node = \Drupal::entityTypeManager()->getStorage('node')->load($node->nid->value);
    $node->body->format = 'full_html';
    $node->save();
}Corrigindo o formato do campo field_resumo para múltiplos tipos de conteúdos
Carregando todos nodes do tipo ficha e alterando o campo body->format para full_html:
$tipos = ['catalogos','livros',,'producoes_visuais','trabalhos_de_conclusao'];
$nids = \Drupal::entityQuery('node')->condition('type',$tipos, 'IN')->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
foreach ($nodes as $node) {
    $node = \Drupal::entityTypeManager()->getStorage('node')->load($node->nid->value);
    $node->field_resumo->format = 'full_html';
    $node->save();
}Se o campo for multivalorado talvez tenha que fazer algo do tipo:
$node->field_resumo[0]->format
ou um loop no campo
Substituindo string em um campo de todos nodes do mesmo tipo
Dado um tipo de conteúdo chamado verbete no qual há um campo field_verbete, vamos substituir tudo de antigo.fflch.usp.br para novo.fflch.usp.br:
$nids = \Drupal::entityQuery('node')->condition('type','verbete')->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
foreach ($nodes as $node) {
    $node = \Drupal::entityTypeManager()->getStorage('node')->load($node->nid->value);
    $node->field_verbete->value = 
str_replace('antigo.fflch.usp.br','novo.fflch.usp.br',$node->field_verbete->value);
    $node->save();
}Trocando o campo alias
Dado que você tem o objeto $node pode trocar a url alternativa dessa forma:
$node->path->alias = '/novo-caminho-do-node'
$node->path->pathauto = Drupal\pathauto\PathautoState::SKIP;
$node->save();Marcando pais dos termos de taxonomia
Esse script carrega todos nodes de um tipo de conteúdo chamado fotos_bd que contém um campo que faz referência a termos de taxonomia: field_descritores. Ocorre que esses termos apresentam uma hierarquia entre si, mas somente os termos filhos estão marcados nos nodes. Esse script procura os termos de que pai e os marca também.
$nids = \Drupal::entityQuery('node')->condition('type','fotos_bd')->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
foreach ($nodes as $node) {
    $node = \Drupal::entityTypeManager()->getStorage('node')->load($node->nid->value);
    $descritores = $node->get('field_descritores');
    # 1. Guardar todos tids, de pais e filhos
    $tids = [];
    foreach ($descritores->referencedEntities() as $descritor) {
        array_push($tids, $descritor->id());
        if($descritor->parent->target_id != 0) {
          array_push($tids, $descritor->parent->target_id);
        }
    }
    $tids = array_unique($tids);
    # 2. monta um array $update com somente os tids que deve ficar
    $update = [];
    foreach($tids as $tid) {
      $update[] = ['target_id' => $tid];
    }
    $node->field_descritores = $update;
    $node->save();
}Manipulating nodes usign Api:
Nodes are fundamental entities that represent individual pieces of content such as articles, pages, blog posts, and more. The Drupal API provides a powerful set of functions and methods to manipulate nodes programmatically.
Attach a file to the node:
<?php 
use \Drupal\node\Entity\Node;
use \Drupal\file\Entity\File;
$data = file_get_contents('/home/thiago/sabrina.pdf');
$file = file_save_data($data, 'public://sabrina.pdf', FILE_EXISTS_REPLACE);
$node = Node::create([
    'type' => 'livros',
    'title' => 'Teste com Sabrina',
    'field_tombo' => 123,
    'field_arquivo' => [
        'target_id' => $file->id(),
        'alt' => 'Pdf com o nome da sabrina',
        'title' => 'Sabrina pdf'
    ],
]);
$node->save();Attach multiple files to the node:
<?php 
use \Drupal\node\Entity\Node;
use \Drupal\file\Entity\File;
$data1 = file_get_contents('/home/thiago/sabrina1.pdf');
$data2 = file_get_contents('/home/thiago/sabrina2.pdf');
$file1 = file_save_data($data1, 'public://sabrina1.pdf', FILE_EXISTS_REPLACE);
$file2 = file_save_data($data2, 'public://sabrina2.pdf', FILE_EXISTS_REPLACE);
$node = Node::create([
    'type' => 'livros',
    'title' => 'Teste com Sabrina 2 arquivos',
    'field_tombo' => 123,
    
    'field_arquivo' => [
        [
            'target_id' => $file1->id(),
            'alt' => 'Pdf 1 com o nome da sabrina',
            'title' => 'Sabrina 1 pdf'
        ],
        [
            'target_id' => $file2->id(),
            'alt' => 'Pdf 2 com o nome da sabrina',
            'title' => 'Sabrina 2 pdf'
        ],
    ],
    
]);
$node->save();