当サイトを最適な状態で閲覧していただくにはブラウザのJavaScriptを有効にしてご利用下さい。
JavaScriptを無効のままご覧いただいた場合には一部機能がご利用頂けない場合や正しい情報を取得できない場合がございます。
承知しました
本サイトではWebサイトのエクスペリエンスを向上させるために、Cookieを使用しています。Cookieはブラウザの設定から無効にできます。本サイトで使用するCookieについては、プライバシーポリシーをご確認ください。

Blog

ブログ

開発者向け

既存のコンテンツアイテムに追加データをインポートする

By Matus Usiak  

SEOデータを外部システムに持っていて、それを既存のアイテムにインポートしたいですか?これがあなたの場合であるならば、ほんの数ステップでそれをする方法を学んでください。

この記事では、外部システムからのデータを既存のアイテムにインポートする方法を見ていきます。このサンプルでは、SEOデータを使用しますが、このアプローチは、外部ソースからのほとんどすべてのデータに対して機能します。このサンプルは、Kontentのコンテンツタイプの構造を反映するCSV形式のデータを処理します。

1.コンテンツタイプを準備します

既存のアイテムでは、それらが基づいているコンテンツタイプにはすでにいくつかの要素があります。このタイプを、外部システムの構造を反映する新しいフィールドで更新します。これを実行するには、次の3つのオプションがあります。

 curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer  curl --request PATCH\ 'https://manage.kontent.ai/v2/projects/ProjectId/types/codename/TypeCodename' \ --header 'Authorization: Bearer 
 client.modifyContentType()  //.byTypeId('0be13600-e57c-577d-8108-c8d860330985')
 .byTypeCodename( 'coffeemaker' )  // .byTypeExternalId('my-article-id')
 .withData( {        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta title' ,			'type' : 'text'
 },        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta description' ,			'type' : 'text'
 }        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta keywords' ,			'type' : 'text'
 } }, ) .subscribe( ( response ) => {    console .log(response); },    ( error ) => {      console .log(error); client.modifyContentType()  //.byTypeId('0be13600-e57c-577d-8108-c8d860330985')
 .byTypeCodename( 'coffeemaker' )  // .byTypeExternalId('my-article-id')
 .withData( {        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta title' ,			'type' : 'text'
 },        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta description' ,			'type' : 'text'
 }        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta keywords' ,			'type' : 'text'
 } }, ) .subscribe( ( response ) => {    console .log(response); },    ( error ) => {      console .log(error); client.modifyContentType()  //.byTypeId('0be13600-e57c-577d-8108-c8d860330985')
 .byTypeCodename( 'coffeemaker' )  // .byTypeExternalId('my-article-id')
 .withData( {        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta title' ,			'type' : 'text'
 },        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta description' ,			'type' : 'text'
 }        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta keywords' ,			'type' : 'text'
 } }, ) .subscribe( ( response ) => {    console .log(response); },    ( error ) => {      console .log(error); client.modifyContentType()  //.byTypeId('0be13600-e57c-577d-8108-c8d860330985')
 .byTypeCodename( 'coffeemaker' )  // .byTypeExternalId('my-article-id')
 .withData( {        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta title' ,			'type' : 'text'
 },        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta description' ,			'type' : 'text'
 }        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta keywords' ,			'type' : 'text'
 } }, ) .subscribe( ( response ) => {    console .log(response); },    ( error ) => {      console .log(error); client.modifyContentType()  //.byTypeId('0be13600-e57c-577d-8108-c8d860330985')
 .byTypeCodename( 'coffeemaker' )  // .byTypeExternalId('my-article-id')
 .withData( {        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta title' ,			'type' : 'text'
 },        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta description' ,			'type' : 'text'
 }        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta keywords' ,			'type' : 'text'
 } }, ) .subscribe( ( response ) => {    console .log(response); },    ( error ) => {      console .log(error); client.modifyContentType()  //.byTypeId('0be13600-e57c-577d-8108-c8d860330985')
 .byTypeCodename( 'coffeemaker' )  // .byTypeExternalId('my-article-id')
 .withData( {        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta title' ,			'type' : 'text'
 },        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta description' ,			'type' : 'text'
 }        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta keywords' ,			'type' : 'text'
 } }, ) .subscribe( ( response ) => {    console .log(response); },    ( error ) => {      console .log(error); client.modifyContentType()  //.byTypeId('0be13600-e57c-577d-8108-c8d860330985')
 .byTypeCodename( 'coffeemaker' )  // .byTypeExternalId('my-article-id')
 .withData( {        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta title' ,			'type' : 'text'
 },        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta description' ,			'type' : 'text'
 }        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta keywords' ,			'type' : 'text'
 } }, ) .subscribe( ( response ) => {    console .log(response); },    ( error ) => {      console .log(error); client.modifyContentType()  //.byTypeId('0be13600-e57c-577d-8108-c8d860330985')
 .byTypeCodename( 'coffeemaker' )  // .byTypeExternalId('my-article-id')
 .withData( {        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta title' ,			'type' : 'text'
 },        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta description' ,			'type' : 'text'
 }        op : 'addInto' ,        path : '/elements' ,        value : {			'name' : 'Meta keywords' ,			'type' : 'text'
 } }, ) .subscribe( ( response ) => {    console .log(response); },    ( error ) => {      console .log(error);

2.外部データをペアリングします

CSVファイル内の各行は、Kontentの1つのアイテムを表します。正しい行を対応するアイテムとペアにします。これがスムーズに間違いなく行われるようにするには、識別子を決定する必要があります。この識別子を使用すると、正しいペアを作成できます。

Kontent側のコードネームは、常に一意であるため、適切な識別子です。外部データに関しては、データがどのように見えるかに基づいて決定することができます。 Kontentのコードネームに対応する列を見つけるのが最善です。注意すべき点の1つは、選択した列に一意の値が含まれている必要があることです。

次の図では、データをどのように照合し、どのように表示されるかを確認できます。既存のアイテムがさまざまな都市のカフェの場所を表すサンプルを使用しています。外部システムには各都市のメタデータがあり、右側に表示されています。この場合、アイテムのcodenameプロパティとCSVのnameプロパティを識別子として使用します。

Kontent
KontentのアイテムとCSVファイルの行

既存のアイテムが管理APIを介してインポートされ、手動で作成されていない場合、それらにはすでに外部IDが割り当てられている可能性があります。このIDは、ペアを取得するために使用できる外部システムのIDに対応している可能性があります。

3.外部データをKontentにインポートします

インポート自体については、管理APIを直接使用することも、JavascriptSDKを使用することもできます。
インポート全体は、次のようないくつかのセクションに分けることができます。

  • コードネームを使用して、アイテムの言語バリアントを取得します。ここで、 workflow_step idをメモします。
  • 「ドラフト」および「公開済み」ワークフローステップのIDを取得します。
    以下のコードサンプルは、JavascriptSDKを介してIDを取得する方法を示しています。
 // Gets the 'draft' step ID
client.listWorkflowSteps() .subscribe( ( response ) => {	for (index in response.data) {		var workflowStep = response.data[index];		if (item.name === 'Draft' ) {			console .log(item.id); } } },    ( error ) => {      console .log(error); // Gets the 'draft' step ID
client.listWorkflowSteps() .subscribe( ( response ) => {	for (index in response.data) {		var workflowStep = response.data[index];		if (item.name === 'Draft' ) {			console .log(item.id); } } },    ( error ) => {      console .log(error); // Gets the 'draft' step ID
client.listWorkflowSteps() .subscribe( ( response ) => {	for (index in response.data) {		var workflowStep = response.data[index];		if (item.name === 'Draft' ) {			console .log(item.id); } } },    ( error ) => {      console .log(error); 
 // Gets the 'published' step ID
client.listWorkflowSteps() .subscribe( ( response ) => {	for (index in response.data) {		var workflowStep = response.data[index];		if (item.name === 'Published' ) {			console .log(item.id); } } },    ( error ) => {      console .log(error); // Gets the 'published' step ID
client.listWorkflowSteps() .subscribe( ( response ) => {	for (index in response.data) {		var workflowStep = response.data[index];		if (item.name === 'Published' ) {			console .log(item.id); } } },    ( error ) => {      console .log(error); // Gets the 'published' step ID
client.listWorkflowSteps() .subscribe( ( response ) => {	for (index in response.data) {		var workflowStep = response.data[index];		if (item.name === 'Published' ) {			console .log(item.id); } } },    ( error ) => {      console .log(error);
  • ワークフローのステップIDを比較して、バリアントが公開されているかどうかを確認します。前の手順で「公開された」IDを取得し、バリアントのJSON応答(最初のポイント)に含まれているIDと比較します。
    • 2つのIDが一致する場合は、バリアントが公開されており、新しいバージョンを作成する必要があることを意味します。新しいバージョンが作成されたら、それを更新して、最終的に新しいバージョンを公開できます。
    • 2つのIDが一致しない場合、バリアントは公開されません。アイテムが「ドラフト」ワークフローステップにあることを確認してください。それを確立したら、更新を進めます。すぐに公開したい場合はアイテムを公開するか、好みに応じて「ドラフト」ステップでアイテムを保持します。
    • バリアントが「ドラフト」ステップにない場合は、更新する前にそのステップに移動する必要があります。

結果と考えられる障害

インポートが完了し、すべてがスムーズに実行されると、新しいデータで更新されたアイテムが表示されます。可能であれば、アイテムに重複がないかどうかを確認し、すべてが目的のデータで更新されていることを確認します。

発生する可能性のある問題の1つは、Kontentがインポートされたデータを処理できない場合です。これは、たとえば、リッチテキストデータをKontentのリッチテキスト要素に直接インポートしようとしている場合に発生する可能性があります。 Kontentのリッチテキスト要素は、特定のHTMLタグ、属性、および要素でのみ機能します。詳細については、APIリファレンスをご覧ください

一方、そのようなマークアップは、追加のフォーマットまたは機能を提供できます。このようなデータを処理する方法の1つは、 コンポーネントを作成することです。次に、フロントエンドアプリケーションで、コンポーネントのタイプを検出し、必要に応じてその内容を表示します。

これを行うには、これらのコンポーネントごとにコンテンツタイプを作成し、後でリッチテキスト要素内でそれらを使用します。コンポーネントに一致するように、元の構文も新しい構文に置き換える必要があります。ただし、ビジネスシナリオは常に最前線に置いてください。フォーマットがコンテンツモデルの概念を覆い隠すと、複雑すぎるコンテンツモデルが作成されます。

Headless CMSの導入をお考えでしょうか?

クラウドとマルチデバイスに最適化されたKentico Kontentをお試しください