Movable Typeの記事の場合はエクスポートする機能が標準で用意されていますが、コンテンツデータの場合はその機能がありません。
今回はコンテンツデータに登録している情報したいということがあったので、テンプレートでCSVファイルを作成する形を試してみます。
サンプルコード
今回は「商品情報」というコンテンツタイプで、以下のような内容で登録しています。
CSVファイルを作成する上でのポイントは以下の2点です。
- 値にカンマ(,)やダブルクォーテーション(“)、、改行を含む場合はダブルクォーテーションで囲む必要がある。(含んでない場合にダブルクォーテーションで囲んでも問題ない)
- 値に含まれるダブルクォーテーションは、2つ並べてエスケープする(” → “” にする)。
上記を踏まえてテンプレートを作成してみます。
インデックステンプレートの作成を行い、以下のような内容にして、出力ファイル名をitem.csvとして保存します。
<mt:Ignore>コンテンツの総数取得</mt:Ignore> <mt:Contents content_type="商品情報"> <mt:SetVarBlock name="total"><mt:ContentsCount></mt:SetVarBlock> </mt:Contents> <mt:Ignore>コンテンツから必要な項目を取得して、CSVの行単位でrowsに格納</mt:Ignore> <mt:Contents content_type="商品情報" limit="$total"> <mt:SetVarBlock name="name">"<mt:ContentLabel regex_replace='/"/g','""'>"</mt:SetVarBlock> <mt:SetVarBlock name="desc"><mt:ContentField content_field="商品説明文">"<mt:ContentFieldValue regex_replace='/"/g','""'>"</mt:ContentField></mt:SetVarBlock> <mt:SetVarBlock name="price"><mt:ContentField content_field="商品価格">"<mt:ContentFieldValue regex_replace='/"/g','""'>"</mt:ContentField></mt:SetVarBlock> <mt:Ignore>取得した項目をカンマ区切りにして、rowsの配列に追加</mt:Ignore> <mt:SetVarBlock name="rows" function="push"><mt:Var name="name">,<mt:Var name="desc">,<mt:Var name="price"></mt:SetVarBlock> </mt:Contents> <mt:Ignore>CSVの内容出力</mt:Ignore> 商品名,商品説明文,商品価格 <mt:Loop name="rows"><mt:Var name="__value__"> </mt:Loop>
基本的にはコード内でコメントしている通りですが、最初の1~4行目でコンテンツデータの総数を取得、その総数を使って6~13行目でコンテンツデータのループを回しています。
8~10行目がCSVで使う商品名(データ識別ラベル)と商品説明文、商品価格の取得で、regex_replaceで値に含まれるダブルクォーテーション(“)をダブルクォーテーション2つ(“”)に置き換えたうえで、値全体をダブルクォーテーションで囲っています。
12行目でそれぞれの値をカンマ区切りでまとめてrowsという配列形式の変数に追加して、16行目でヘッダー行を出力した上で、17~18行目でrowsの配列でループして各行を出力、という流れになります。
これで以下のようなCSVファイルが作成できました。
商品名,商品説明文,商品価格 "商品K",, "商品J","商品Jです", "商品I",,"$50" "商品H",, "商品,G","商品,Gです","1,000円" "商品""F""","""商品F""です","""300""円" "商品E","商品Eです。 おすすめです。","10,000円" "商品D",, "商品,C","""商品C""です。", "商品B","商品Bです。","1000" "商品A","商品Aの説明文です。","500円"
コメントが承認されるまで時間がかかります。