web-dev-qa-db-ja.com

ノードのみを移行する方法はありますか?

完全な移行をしたくありません。ノードのみを移行したい(できれば Metatag メタデータも含めて)。ビュー、パネル、コンテキスト、URLリダイレクトではなく、ノードのみ...

完全なD7 >> D8アップグレードでいくつかの問題が発生した後、Drupalアップグレードモジュールを使用したとき、私は このスレッドに関するDAのスレッド を開いただけです)。したがって、部分的な移行のみを行う方法、または部分的に移行する方法を探しています。

ノードに関しては可能ですか?

7
JohnDoea

完全な移行を行う必要はありません。古いサイトに接続してアップグレードプロセスを初期化すると、移行が作成されます。次に、それらを自動的に実行する代わりに、upgrade_toolsプロジェクトが提供するUIを使用してそれらの一部のみを実行できます(私はそう思いますか?)。

ただし、移行には依存関係があります。ノードの移行を実行できるようにするには、デフォルトで他のいくつかを実行する必要があります。ユーザー、テキスト形式、およびフィールド。

Drush ceditまたはexport/importを使用して、作成されたマイグレーションを編集することで、これを変更することができます。誰かがそのためのUIにも取り組んでいると思います。

マッピングやフィールドの移行方法をカスタマイズすることもできます。デフォルトの動作では、すべてのフィールドと構成が1対1で移行されますが、正直なところ、ほとんどのサイトでこれが実行されることは想像できません。代わりに、彼らが新しいD8サイトを構築し、コンテンツをインポートすることを想像しています。

移行ドキュメント を参照してください。そのトピックの周りにはすでにたくさんのブログ投稿がありますが、それは簡単なことではありません。

または、コメントで述べたように、コンテンツをエクスポート/インポートすることもできます。フィードはまだ準備ができていませんが、カスタムコードを作成してビューのエクスポートとインポートを使用できます。

9
Berdir

これには移行が少し重くなります。 drupal 7では、コンテンツのインポート/エクスポートのみのモジュールがいくつかありました。Indrupal 8では、まだ準備ができているモジュールは見つかりませんでした。少しのコードで:

drupal 7で、モジュールの助けを借りてcsvへのビューでエクスポートを行いました:

views_data_export

drupal 8では、php-libraryを使用しました:

parsecsv-for-php

そしてこのコード:

require_once('parsecsv.lib.php');
$csv = new parseCSV();
$csv->auto($filepath);
foreach ($csv->data as $key => $row) {
  $node = entity_create('node', array('type' => 'article', 'title' => $row['title'], 'uid' => $row['uid']));
  $node->langcode->value = 'en';
  $body = $row['body'];
  $body = str_replace('http://Host1.com/', 'http://Host2.com/', $body);
  $node->body->value = $body;
  $node->body->format = 'full_html'; 
  ...
  $node->save();
}

利点は、drupal 7からのパスを置き換える、または固定言語を設定するなどの独自の調整を行うことができることです。また、すべての依存関係が満たされているかどうか、たとえばuidがもう着いている。

5
4k4

D8の移行モジュールはデフォルトですべてのコンテンツタイプを移行するため、一部のコンテンツタイプは移行からスキップしました。カスタムモジュールのコンテンツタイプをスキップするために、hook_migrate_prepare_rowを使用しました。

function hook_migrate_prepare_row(Row $row, MigrateSourceInterface $source, MigrationInterface $migration) {
  // Ignore content types from being migrated.
  if ($migration->id() == 'd6_node_type') {
    $ignore_content_types = array('content_type1', 'content_type2');
    if (in_array($row->getSource()['type'], $ignore_content_types)) {
      return FALSE;
    }
  }

  // Ignoring content of 4 content types.
  $ignore_content_types_content = array('d6_node__content_type1', 'd6_node__content_type2');
  if (in_array($migration->id(), $ignore_content_types_content)) {
    return FALSE;
  }
}

より詳しい情報。 - https://www.drupal.org/node/2641912

Drush migrate-statusコマンドを使用して移行IDのリストを取得し、必要に応じてそれらをスキップします。

1
amitgoyal