Single Content Sync

任意のコンテンツエンティティをすべてのエンティティ参照とともにYAML形式でエクスポートし、別の環境にインポートできる包括的なコンテンツエクスポート/インポートモジュールです。

single_content_sync
12,368 sites
76
drupal.org

インストール

Drupal 11, 10, 9 v1.4.14
composer require 'drupal/single_content_sync:^1.4'

概要

Single Content Syncは、異なるDrupal環境間でコンテンツエンティティを簡単かつ強力にエクスポート・インポートする方法を提供します。このモジュールは、メディア、タクソノミーターム、Paragraphs、ファイルなどの参照エンティティを含むコンテンツをYAML形式でエクスポートします。

主な機能には、完全なエンティティ参照ツリーを持つ単一コンテンツアイテムのエクスポート、翻訳のサポート、Views Bulk Operationsによる一括エクスポート操作、hook_update_Nによるデプロイ時の自動インポートなどがあります。このモジュールは、カスタムエンティティタイプやフィールドタイプへのサポート拡張のためのプラグインシステムと、エクスポート/インポートプロセスをカスタマイズするためのイベントを備えています。

コンテンツはUUIDで識別され、インポート時に既存のコンテンツを更新したり、新しいコンテンツを作成したりできます。このモジュールは、単一のYAMLファイル(ファイルURLは絶対パス)または全てのファイルアセットを含むZIPアーカイブとしてエクスポートできます。

Features

  • 任意のコンテンツエンティティ(Node、Media、タクソノミーターム、Blockなど)をすべてのエンティティ参照とともにYAML形式でエクスポート
  • 管理UI、プログラム、またはDrushコマンドを通じてYAMLまたはZIPファイルからコンテンツをインポート
  • Paragraphs、Media、ファイル、タクソノミータームを含むすべての参照エンティティの自動再帰エクスポート
  • 翻訳サポート - 多言語コンテンツのすべての翻訳をエクスポートおよびインポート
  • Views Bulk Operationsを使用して複数のコンテンツアイテムを一度に一括エクスポート
  • ZIPエクスポートオプションにはすべてのファイルアセット(画像、ドキュメント、動画)が含まれる
  • UUIDベースのコンテンツ同期 - 既存コンテンツの更新または新規作成
  • 誤った環境へのインポートを防ぐためのサイトUUID検証
  • SingleContentSyncBaseFieldsProcessorおよびSingleContentSyncFieldProcessorプラグインによるカスタムエンティティタイプとフィールドタイプのサポート用プラグインシステム
  • エクスポート/インポート動作をカスタマイズするためのイベントシステム(ExportEvent、ImportEvent、ExportFieldEvent、ImportFieldEvent)
  • コマンドラインでのエクスポート/インポート操作用のDrushコマンド
  • 埋め込みエンティティとメニューリンクの設定可能なエクスポートモード(none、stub、またはfull)
  • 単一エンティティを素早くエクスポートするためのエンティティ正規ページのエクスポートタブ
  • Layout Builderセクション、Paragraphs、Metatag、Webform、および多くのcontribフィールドタイプのサポート
  • 整形テキストフィールド内の内部リンクのインテリジェントな処理 - インポート時にエンティティ参照を解決

Use Cases

環境間のコンテンツステージング

開発またはステージング環境からコンテンツをエクスポートし、本番環境にインポートします。すべてのファイルアセットを含めるにはZIPエクスポートオプションを使用します。サイトUUIDチェックは、異なるサイトインスタンス間でコンテンツを移動する場合は無効にでき、クローンされた環境間でのみコンテンツが移動するようにするには有効にできます。

コンテンツのバックアップと復元

重要なコンテンツアイテムをバージョン管理またはバックアップストレージに保存されたYAMLファイルとしてエクスポートします。YAMLファイルをインポートすることでコンテンツを復元でき、UUIDにより元のコンテンツが複製されるのではなく更新されます。

デフォルトコンテンツの自動デプロイ

コンテンツYAML/ZIPファイルをカスタムモジュールのassetsフォルダに保存し、hook_update_Nまたはhook_deployを使用してデプロイ時にインポートします。例:\Drupal::service('single_content_sync.importer')->importFromFile($module_path . '/assets/homepage.yml');

多言語コンテンツの同期

「すべての翻訳を含める」オプションでコンテンツをエクスポートし、すべての言語バージョンをキャプチャします。インポート時に、同じ言語関係を維持しながら翻訳が再作成されます。

Viewsを使用した一括コンテンツエクスポート

Views Bulk Operationsの「コンテンツのエクスポート」アクションを使用して、複数のコンテンツアイテムを一度に選択してエクスポートします。カテゴリ内のすべての記事やすべての製品など、特定のコンテンツセットをエクスポートするのに便利です。

別のDrupalサイトからのコンテンツ移行

ソースDrupalサイトからコンテンツをエクスポートし、ターゲットサイトにインポートします。インポート時にサイトUUIDチェックを無効にします。モジュールは、欠落している参照のスタブエンティティを作成しながら、エンティティ参照の解決を処理します。

CI/CDでのDrushベースのコンテンツ同期

自動化されたデプロイメントパイプラインでdrush content:exportおよびdrush content:importコマンドを使用します。ビルドフェーズ中にコンテンツをエクスポートし、デプロイ中にインポートして、環境間で一貫したコンテンツを確保します。

カスタムエンティティタイプのサポート

カスタムエンティティタイプ用にSingleContentSyncBaseFieldsProcessorプラグインを実装して、エクスポート/インポートサポートを有効にします。プラグインは、インポート時に基本フィールドがエクスポートおよびマッピングされる方法を定義します。

カスタムフィールドタイプのサポート

デフォルトでサポートされていないカスタムまたはcontribフィールドタイプ用にSingleContentSyncFieldProcessorプラグインを実装します。プラグインは、エクスポート時のフィールド値の変換とインポート時のエンティティ作成を処理します。

Tips

  • コンテンツにファイル(画像、ドキュメント)が含まれる場合は、ZIPエクスポートを使用してすべてのアセットが含まれ、正しくインポートされるようにしてください。
  • 本番環境では、クローンされていない環境からの誤ったコンテンツ上書きを防ぐためにサイトUUIDチェックを有効にしてください。
  • 埋め込みエンティティには「stub」エクスポートモードを使用して、参照の整合性を維持しながらエクスポートファイルサイズを削減してください。
  • エクスポートされたYAMLファイルをカスタムモジュールのassetsフォルダに保存して、デプロイ時のコンテンツインポートに使用してください。
  • ファイルを作成せずにエクスポートされる内容をプレビューするために、最初に--dry-runオプション付きでDrushコマンドを使用してください。
  • ImportEventをサブスクライブして、コンテンツが保存される前にカスタム検証または変換ロジックを追加してください。
  • フィルタリングされたコンテンツセット(例:2024年のすべての公開記事)をエクスポートするために、Viewsで一括エクスポートアクションを使用してください。
  • カスタムフィールドプロセッサプラグインを作成する場合、基本機能のためにSingleContentSyncFieldProcessorPluginBaseを継承してください。
  • エクスポート/インポートフォームのYAMLエディタはシンタックスハイライトを提供します - コンテンツ構造をすばやく確認するために使用してください。
  • 複雑な移行の場合、プロセスをより制御するために、このモジュールをコアMigrateと組み合わせることを検討してください。

Technical Details

Admin Pages 3
Single Content Sync設定 /admin/config/content/single-content-sync

エクスポート可能なエンティティタイプとバンドルを設定し、埋め込みエンティティとメニューリンクのエクスポートモードを設定し、インポート/エクスポート操作用のファイルストレージスキーマを設定します。

コンテンツのインポート /admin/content/import

YAMLまたはZIPファイルをアップロードするか、YAMLコンテンツを直接貼り付けて、別の環境からコンテンツをインポートします。コンテンツはUUIDでチェックされ、既存のコンテンツは更新され、新しいコンテンツは作成されます。

エクスポート /{entity_type}/{entity_id}/export

単一のコンテンツエンティティをYAML形式でエクスポートします。フォームにはエクスポートされたコンテンツのプレビューが表示され、YAMLまたはZIPファイルとしてダウンロードするオプションが提供されます。すべてのコンテンツエンティティの正規ページで利用可能な動的ルートです。

権限 4
ユーザーにすべてのコンテンツのエクスポートを許可

許可されたコンテンツエンティティタイプのエクスポートへのアクセスを付与します

ユーザーにすべてのコンテンツのインポートを許可

管理UIを通じたコンテンツのインポートへのアクセスを付与します

Single Content Sync設定の管理

許可するエンティティタイプを含むモジュール設定へのアクセスを付与します

{エンティティタイプ}: エンティティのエクスポート

エクスポートリンクテンプレートを持つ各コンテンツエンティティタイプに対して生成される動的権限。ユーザーがエクスポートできるエンティティタイプをきめ細かく制御できます。

Hooks 4
hook_content_export_field_value_alter

エクスポート中にフィールド値を変更します。1.4.0で非推奨となりました。代わりにSingleContentSyncFieldProcessorプラグインまたはExportFieldEventを使用してください。

hook_content_export_entity_alter

エクスポート中にエンティティの基本フィールドを変更します。1.4.0で非推奨となりました。代わりにSingleContentSyncBaseFieldsProcessorプラグインまたはExportEventを使用してください。

hook_content_import_entity_alter

インポート中にエンティティが保存される前に変更します。1.4.0で非推奨となりました。代わりにSingleContentSyncBaseFieldsProcessorプラグインまたはImportEventを使用してください。

hook_content_import_field_value_alter

インポート中にフィールド値を変更します。1.4.0で非推奨となりました。代わりにSingleContentSyncFieldProcessorプラグインまたはImportFieldEventを使用してください。

Drush Commands 2
drush content:export

指定されたエンティティタイプのすべてのコンテンツをエクスポートします。デフォルトでは、すべてのNodeをDRUPAL_ROOT/scs-exportディレクトリにエクスポートします。

drush content:import

指定されたパスのYAMLまたはZIPファイルからコンテンツをインポートします。

Troubleshooting 7
「Content source site has another UUID」エラーでインポートが失敗する

これは、サイトUUIDチェックが有効で、コンテンツが異なるDrupalインストールから来た場合に発生します。/admin/config/content/single-content-syncの設定で「サイトUUIDチェック」を無効にするか、同じサイトインスタンスからエクスポートしてください。

エンティティタイプがエクスポートオプションに表示されない

エンティティタイプには正規URLリンクテンプレートが必要です。設定ページでエンティティタイプがエクスポート用に有効になっていることを確認してください。カスタムエンティティタイプは、エンティティ定義で'canonical'リンクテンプレートを定義する必要があります。

カスタムエンティティタイプの基本フィールドがエクスポートされない

エンティティタイプ用にSingleContentSyncBaseFieldsProcessorプラグインを実装するか、ExportEventイベントサブスクライバを使用してカスタム基本フィールドの処理を追加してください。基本フィールドがエクスポートできない場合、モジュールは警告を表示します。

参照されたエンティティがインポート時に作成されない

参照されたエンティティのバンドルがターゲットサイトに存在することを確認してください。モジュールは欠落している参照のスタブエンティティを作成しますが、バンドルは定義されている必要があります。すべての必要なフィールドタイプに適切なフィールドプロセッサプラグインがあることを確認してください。

ZIPインポートが構造エラーで失敗する

ZIPファイルに余分な親ディレクトリが含まれていないことを確認してください。YAMLファイルはZIPのルートにあり、アセットは'assets'サブフォルダにある必要があります。ZIPはモジュールのエクスポート機能で作成されている必要があります。

ファイルが正しくインポートされない

ZIP以外(YAMLのみ)でインポートする場合、ファイルは絶対URLで参照されます。ソースURLがアクセス可能であることを確認してください。ローカルファイル転送には、すべてのファイルアセットを含むZIPエクスポートを使用してください。

翻訳がインポートされない

インポート前にターゲット言語がターゲットサイトで有効になっていることを確認してください。エクスポート時に「すべての翻訳を含める」オプションが有効になっていたことを確認してください。コンテンツタイプで翻訳が有効になっていることを確認してください。

Security Notes 6
  • エクスポートされたコンテンツには機密フィールドデータが含まれる可能性があるため、信頼できるユーザーにのみ「export single content」権限を付与してください。
  • インポートは任意のコンテンツを作成/変更できるため、信頼できる管理者にのみ「import single content」権限を付与してください。
  • 任意のソースからのコンテンツのインポートを許可するため、サイトUUIDチェックを無効にする場合は注意してください。
  • エクスポートされたYAMLファイルには機密情報が含まれる可能性があります - 安全に保管し、公開リポジトリにコミットしないでください。
  • モジュールはインポート時にファイルの内容を検証しません - ZIPファイルが信頼できるソースからのものであることを確認してください。
  • エクスポートされたコンテンツ内のユーザー参照はメールアドレスを使用しており、これは個人情報と見なされる場合があります。