Script de migration de Drupal 7 vers Hugo

Jan 13, 2018 12:06 · 206 words · 1 minute read

Voici le script que j'ai écrit rapidement pour migrer les contenus de ce site vers Hugo. Il est fait en mode quick & dirty, le but étant de ne pas passer trop de temps dessus.

Il est à adapter à vos champs Drupal, et il a un gros défaut, il n'enregistre pas les fichiers liés, j'en avait pas besoin ayant seulement 5 images contribuées.

Si vous avez des commentaires ou améliorations à faire, voici le gist.

<?php

define('DRUPAL_ROOT', __DIR__);
include_once(DRUPAL_ROOT . '/includes/bootstrap.inc');
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

$nids = db_query('SELECT DISTINCT(nid) FROM {node}')
  ->fetchCol();

$nodes = node_load_multiple($nids);

foreach($nodes as $node) {

  $front_matter = array(
    'title' => $node->title,
    'date' => date('c', $node->created),
    'lastmod' => date('c', $node->changed),
    'draft' => 'false',
  );

  if (count($node->taxonomy_vocabulary_2[LANGUAGE_NONE])) {
    $tags = taxonomy_term_load_multiple(
      array_column(
        $node->taxonomy_vocabulary_2[LANGUAGE_NONE],
        'tid'
      )
    );
    $front_matter['tags'] = array_column($tags, 'name');
  }

  if (count($node->taxonomy_vocabulary_1[LANGUAGE_NONE])) {
    $cat = taxonomy_term_load_multiple(
      array_column(
        $node->taxonomy_vocabulary_1[LANGUAGE_NONE],
        'tid'
      )
    );
    $front_matter['categories'] = array_column($cat, 'name');
  }

  $path = drupal_get_path_alias('node/'.$node->nid);
  if ($path != 'node/'.$node->nid) {
    $front_matter['url'] = '/'.$path;
    $content_dir = explode('/', $path);
    $content_dir = end($content_dir);
  }
  else {
    $content_dir = $node->nid;
  }

  $content = json_encode(
    $front_matter,
    JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE
  );

  $content .= "\n\n";

  $tmp_file = '/tmp/node.html';
  file_put_contents($tmp_file, $node->body['fr'][0]['value']);
  $body = shell_exec('html2markdown '.$tmp_file);
  unlink($tmp_file);
  //$body = $node->body['fr'][0]['value'];
  $content .= $body;

  $dir_name = '/tmp/hugo/content/'.$node->type.'/'.$content_dir;
  mkdir($dir_name, 0777, true);
  file_put_contents($dir_name.'/index.md', $content);
}