Introduction

When I migrated all of my drupal-7 website to drupal-8, I wrote automation to import all my old nodes into new drupal-8. Drupal did not provide any best way to migrate all of my nodes. So, I wrote this automation.

In this post, I will describe how I exported all my nodes into JSON files. In another post, I will explain how I imported them, with their URL alias intact.

Php code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php
function writeFile($filename, $content) {
    $myfile = fopen($filename, "w") or die("Unable to open file!");
    fwrite($myfile, $content);
    fclose($myfile);
}

function getTidsArray($tidsArray) {
    $tids = [];
    foreach($tidsArray as $val) {
        $tids[] = $val['tid'];
    }
    return $tids;
}

function getTermNames($tidsArray) {
    $tids = getTidsArray($tidsArray['und']);
    $txs = taxonomy_term_load_multiple($tids);
    $txNames = [];
    foreach($txs as $tx) {
        $txNames[] = $tx->name;
    }
    return $txNames;
}

function getUser($uid) {
    $u = user_load($uid);
    return $u->mail;
}

/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
// Execution starts from here
$nid = 1905;
$howMany = 100;
$till = $nid + $howMany;
$dir = '/var/www/html/sites/default/files/exports/nodes';

for ($i=$nid; $i < $till; $i++) {
$nd = node_load($i);
if (!isset($nd) || !isset($nd->nid)) {
    continue;
}

$nd->user = getUser($nd->uid);

//switch node type
switch($nd->type) {
    case 'add_drawings':
    $nd->field_drawing_tags = getTermNames($nd->field_drawing_tags);
    $nd->field_drawing_category = getTermNames($nd->field_drawing_category);
    $nd->field_drawing_software = getTermNames($nd->field_drawing_software);
    break;

    case 'article':
    $nd->field_tags = getTermNames($nd->field_tags);
    $nd->field_article_category = getTermNames($nd->field_article_category);
    break;

    case 'page':
    case 'youtube_videos':
    //nothing special
    break;

    case 'my_book_reference':
    $nd->field_book_category = getTermNames($nd->field_book_category);
    break;

    case 'my_toolbox_reference':
    $nd->field_tool_category = getTermNames($nd->field_tool_category);
    break;

    default:
    print "\nHow on earth this can be possible! Type: ".$nd->type."\n";
}

$alias = drupal_get_path_alias('node/'.$i);

$folder = $dir . '/' . $nd->type;
if (!file_exists($folder)) {
    mkdir($folder, 0777, true);
}
$filepath = $folder . '/' . $nd->nid . '.json';

$nd->alias = $alias;
$data = json_encode((array)$nd);

//write
writeFile($filepath, $data);
print "Written nid: ".$nd->nid.', alias: '.$alias."\n";
//print $data."\n\n";
}

Explanation of code

See the comment which says: Execution starts from here. Line no. 33

Note: I ran this code through the devel/PHP module. So, this has a small timeout value when running a PHP script. So, I’m running this with 100s of nodes at a time. So, that loop where I’m starting nid=1905, you can start it from 1

Line no 37, the directory where I want to save the JSON files.

Line no 45, Fetching author of the node and saving user details in an attribute in JSON.

Line no 48. A switch case on my content types.

Line no 50, saving term name. As in new DB. The term id will not be the same, but my taxonomy term name was unique in a vocabulary.

Line no 77, saving the alias of node.

The rest of the code is pretty easy to understand.