Studioの記事をmicroCMSへ移したあと、リッチエディタの内容をHTMLとして表示するにはどうしますか?

結論

microCMSのリッチエディタで作成した本文はAPIからHTMLとして取得できるため、表示側のWebサイトで各フレームワークの機能を使ってHTMLとして展開します。ReactならdangerouslySetInnerHTML、AstroならFragmentのset:html、Vueならv-htmlへ文字列を渡すことで、ブラウザ上にタグとして描画する仕組みです。

microCMSへの移行更新日

microCMSのリッチエディタの内容をHTMLとして表示する方法は?

APIから取得した記事本文の文字列を、どのようにWebサイト上で整形されたHTMLとして描画すればよいのでしょうか。

microCMSのリッチエディタで作成した文章は、APIを通じてHTML形式の文字列として取得できます。そのため、表示側で「これはHTMLとして描画する」と指定する書き方が別に用意されています。

表示側書き方補足
React・Next.js<div dangerouslySetInnerHTML={{ __html: body }} />__htmlを持つオブジェクトを渡す
Astro<Fragment set:html={body} />余分な囲みのdivが増えない
Vue・Nuxt<div v-html="body"></div>中に書いたVueのテンプレート構文は動かない

デザインの適用にも少し注意を払いましょう。リッチエディタ側で設定したカスタムclassは表示側の装飾に活用できますが、Vueの単一ファイルコンポーネントでscoped CSSを使っている場合、v-htmlの内部要素にはスタイルが届きません。CSS Modulesを使うか、記事表示エリアに範囲を限定したグローバルCSSを用意して見た目を整えます。

リッチエディタの見出しから目次を自動生成するには?

長文の解説記事などで、冒頭に各章のタイトルが並び、読みたい見出しをクリックすると該当の位置まで滑らかに移動する目次はよく見かける機能です。

Studioではリッチテキストのプロパティごとに見出しと連動した目次が自動で挿入されていましたが、microCMSに移行した後は、取得したHTMLを解析して自前で目次データを組み立てる仕組みをとります。幸いなことに、microCMSのリッチエディタではh1からh5までの見出しに対して、テキスト内容をハッシュ化したid属性が自動で割り振られます。テキストそのものを変更しない限りidの値は固定されるため、ページ内リンクの飛び先としてそのまま利用できるわけです。逆に、公開後に見出しの文言を直すとidも変わり、外部から貼られた見出しへのリンクは外れてしまいますね。

作り方の流れは次の3段階です。

  1. APIで取得した本文HTMLをCheerioで読み込む
  2. h2とh3を取り出し、id・見出しの文字・タグ名を配列にまとめる
  3. 配列から「#id」へのリンク一覧を作り、本文の前に置く

h2とh3に絞っているのは、記事タイトルにh1を使う前提の実装例だからです。

自分でCheerioの処理を書くのが手間なら、microCMSが出しているmicrocms-rich-editor-handlerを使う方法もあります。公式処理ツールのREADMEでも解説されている通り、extractorsにtocExtractor()を指定して本文HTMLを処理すれば、目次リストのデータをまとめた配列を取り出せます。ただ、これはデータを取り出すところまでで、画面に並べる部分は自分で書きましょう。

リッチエディタに入れたコードをシンタックスハイライトするには?

技術ブログなどに掲載するプログラムのコードを、見やすく色分けして表示するにはどのような仕組みを組み込めばよいでしょうか。

microCMSのリッチエディタでは、コードブロックを作成する際にファイル名と言語を指定できます。APIから返ってくるHTMLでは、ファイル名がdiv要素のdata-filename属性に、指定した言語がcode要素のlanguage-javascriptといったクラス名に反映される仕掛けです。ただし、このHTMLをブラウザでそのまま表示するだけでは文字の色付けは行われません。公開サイト側でコードを読みやすく装飾するには、専用のハイライト処理を挟む必要があります。

色付けを行う方法としては、Shikiやhighlight.jsといったライブラリの利用が定番です。microcms-rich-editor-handlerに含まれるsyntaxHighlightingByShikiTransformerを使えば、追加でshikiパッケージを導入することでコードブロックを綺麗に色分けできます。また、cheerioでpre要素やcode要素を抽出し、highlight.jsを通して変換されたHTMLへ置き換えるアプローチも広く使われてきました。言語を自動で判定してくれるので、言語指定のないコードにも色が付きます。

ここで意識したいのが処理を実行する場所です。ブラウザ側で大きなJavaScriptライブラリを読み込んで色付けを実行すると、ページの表示速度が落ちてしまいかねません。どちらの方法でも、処理はサーバー側やビルド時に済ませる形が勧められています。Next.jsならServer Component、Astroなどの静的生成ならビルドのタイミングで色付けまで終えておけば、ブラウザでShikiを動かさずに済みます。記事数が多いブログなら、ここは事前に処理する作りにしておきたいところですね。

microCMSの記事からsitemap.xmlを自動生成するには?

一般的なブログ専用サービスではボタン一つで検索エンジン用のサイトマップが出力されることも多い一方、microCMSにはWebサイト全体のサイトマップを自動生成する機能が備わっていません。記事データを保管・配信するヘッドレスCMSであるため、公開用のXMLファイルはフロントエンド側の仕組みで作り出す必要があります。

たとえばNext.jsのApp Routerを採用しているなら、app/sitemap.tsを作成してURLの配列を返す関数を定義します。microCMSから記事の一覧を取得し、スラッグから記事のURLを組み立てて返す形です。各URLにはlastModifiedも付けられます。

Astroでは@astrojs/sitemapを入れると、静的に生成したページを拾ってサイトマップを作ってくれますよ。getStaticPaths()で記事ページを書き出していれば、その記事も入ります。一方でSSRモードの動的ルートは自動では入りません。さらに、ビルドで出てくるファイルはsitemap-index.xmlとsitemap-0.xmlです。Studio時代に「/sitemap.xml」でSearch Consoleへ送っていた場合は、登録し直すことになります。

作ったサイトマップは、Search Consoleのサイトマップレポートから送信します。ただ、送信したからといってクロールされるとは限りませんね。

サイトマップ内の更新日時には重要な変更があった日時を正しく反映させることが大切です。フッターの著作権表記の年を変えただけの日は当てはまりません。Googleは、この値が正しいと確かめられるときに使います。

お知らせ欄や求人情報だけをmicroCMSで更新する使い方はできますか?

お知らせと求人だけ担当者が自分で書き換えられればいい。こういうサイトの一部だけをCMSにする使い方は、microCMSが得意とするところです。表示部分とデータを切り離せるので、トップページの「お知らせ」欄や採用ページの募集一覧だけをmicroCMSから読み込む形にできます。

もし既存のWebサイトをStudioで構築している場合でも、Data Connect APIを活用すればmicroCMSのデータを読み込んで動的リストや動的ページに反映させられます。StudioのmicroCMS API連携で使えるのはリスト形式のAPIだけです。お知らせも求人も複数の記事が並ぶものなので、リスト形式で作れば困りません。連携の設定と、表示する要素への紐付けは最初に済ませておきます。

料金は、小さな更新欄ならHobbyプランから始められますよ。

項目Hobbyプラン
料金無料
API最大5個
メンバー最大3名
データ転送量月20GBまで(超過するとAPI停止)

お知らせと求人で2個、APIはまだ余ります。ただ転送量を超えるとAPIが止まり、お知らせ欄が表示されなくなるので、アクセスが多いサイトでは料金表で上のプランも見比べておきましょう。

初期の組み込みさえ済ませてしまえば、エンジニアの手を借りることなく、広報や採用の担当者だけで新しいコンテンツを投稿できるようになりますね。求人の項目を増やしたいなど、入力欄の作りを変えるときは、表示側の手直しも合わせて必要になります。

こんな聞き方も

  • microCMSのリッチエディタの内容をHTMLとして表示するにはどうしますか?
  • microCMSのリッチエディタの見出しから目次を自動生成するにはどうしますか?
  • microCMSのリッチエディタに入れたコードをシンタックスハイライトするにはどうしますか?
  • microCMSの記事からsitemap.xmlを自動生成するにはどうしますか?
  • 採用サイトの求人情報をmicroCMSで更新する運用はできますか?
  • お知らせ欄だけをmicroCMSで更新する使い方はできますか?
  • 歯科医院のお知らせや休診日をmicroCMSで更新できますか?

あわせて知りたい(関連する疑問)

QリッチエディタのHTMLをそのまま出して安全ですか?

社内の担当者だけが管理画面から書く場合と、APIから外部の人も書き込める場合とで、答えが変わります。

管理画面から入力されたHTMLをブラウザ上でそのまま展開する場合、最も警戒すべきなのが悪意あるスクリプトが実行されてしまうクロスサイトスクリプティング(XSS)の問題です。ReactのdangerouslySetInnerHTMLが、信頼できてサニタイズ済みのデータだけに使うよう書かれているのはこのためです。

管理画面から更新するのが信頼できる担当者だけなら、不正なHTMLが入り込む見込みは低くなります。それでも、XSSへの対策の案内では、利用先でどんな処理をするかの判断は使う側に任されています。社内だけだから何もしなくていい、とまでは言えません。

特に注意が必要なのは、APIに対して書き込み権限(POST、PUT、PATCH)を外部から許可している場合です。万が一、悪意を持った第三者に書き込み用APIを経由して攻撃用のHTMLを送り込まれると、閲覧者のブラウザ上で不正なコードがそのまま実行されてしまいます。この場合は表示する前に、DOMPurifyなどのライブラリでサニタイズします。サニタイズは、scriptタグや危険な属性を取り除いて、表示してよい部分だけを残す処理です。

記号のエスケープも、フィールドの種類で扱いが違います。

フィールドAPIから返るときのエスケープ
リッチエディタ<>"'& を変換
旧リッチエディタ<>& を変換
テキストエリア・テキストフィールド変換しない

microCMS側では、リッチエディタ内の特定の記号類をエスケープして返却する仕組みが備わっていますが、これだけでHTML全体の安全性が保証されるわけではありません。

QStudioの記事の見出しや装飾はそのまま移りますか?

Studioでこれまで書きためてきた記事の見出し階層や太字などの文字装飾は、microCMSへワンクリックでそのまま引き継げるのでしょうか。

残念ながら、すべてをそのまま自動で移すことはできません。そもそもStudioには、デザインやソースコードをはじめ、Studio CMS内の記事データを外部へ一括して書き出すエクスポート機能が存在しないからです。この制限については、Studioヘルプのエクスポート制限でも明記されています。

さらに、microCMS側へHTMLを取り込む際にも仕様上のルールがあります。microCMSのWRITE APIを使うことで外部からHTML文字列を入稿できますが、取り込めるタグはh1からh5やpタグなど対応範囲が決まっており、あらゆるHTML記法を無条件に保持できるわけではありません。管理画面に直接HTMLを貼り付ける場合も、すべての内容が元の形のまま保存される保証はないとされています。

Studioでは記事タイトルがh1になるので、本文の見出しはh2から始める作りが勧められていました。その書き方に沿っていれば、本文はh2・h3中心のまま移せて、目次の作り方とも合います。

また、移行先のリッチエディタ設定で装飾ボタンがオフになっていると、せっかくのstrongタグも通常の段落テキストに変換されてしまいます。移す前に、Studioの記事で使っている装飾と、microCMSのリッチエディタで有効にしているボタンを照らし合わせておきましょう。

画像の配置については、figureタグのstyle属性にtext-alignを指定することで左揃えや中央揃えを設定できます。色や余白といったStudioで付けていた見た目は、カスタムclassを付けて、表示側のCSSで当て直す形になります。

Q休診日をカレンダー形式で表示できますか?

たとえば木曜と日曜が定休で、年末年始や学会の日に臨時休診がある医院なら、休みの日付をmicroCMSに登録し、表示側でカレンダーに並べる形が作れます。休診日専用の仕組みがあるわけではなく、日付のデータとカレンダーのライブラリを組み合わせる方法です。

microCMS側では、休診日の記事ごとに日時フィールドを用意します。microCMSの日時フィールドで「日付指定のみ」を有効に設定すると、管理画面上での時刻入力を省き、日付だけを迷わず選べるようになります。ただし、APIから返ってくるデータ形式には少し注意が必要です。「日付指定のみ」にしていても、APIのレスポンスにはUTC形式の時刻情報("T00:00:00.000Z"など)が付与された状態で返却されます。そのため、Webサイト側で受け取った後に、日本の標準時に合わせた日付文字列へと整える処理を入れておきましょう。

表示側では、整えた日付をFullCalendarの予定データの配列に変換して渡します。タイトルに「休診」と入れておけば、カレンダーのその日に表示されます。臨時休診を追加したいときは、担当者がmicroCMSに1件足すだけで反映されますね。

もっと手軽にしたいなら、StudioのGoogleカレンダーを埋め込む方法もあります。Embedボックスにカレンダーを入れる方式で、更新はGoogleカレンダー側で行います。また、カレンダーは共有相手にしか表示されないので、すべての訪問者に見せるにはカレンダーの公開範囲を変えておきます。

出典

この内容をChatGPTで相談

無料診断