HTML+YAML方式を選んだ理由:原稿フォーマットの設計判断

はじめに

ブログ原稿の保存形式を何にするかは、自動化全体の天井を決めます。最初に選んだ形式が、後段の変換ロジック、構造化データの実装難易度、AIとの連携しやすさを左右するからです。

私が選んだのはHTML本文+YAMLフロントマターでした。一般的な選択肢である「Markdown一本」を見送った理由と、HTML+YAMLにすることで得た自由度を、この記事で記録します。

原稿フォーマットの三択

ブログ原稿の保存形式は、現実的には三つに絞られます。

選択は「自分にとって譲れない一点」で決まります。私の場合、譲れなかったのはバージョン管理とAI編集のしやすさでした。ブロックエディタはこの時点で消えました。残る二つから、どちらを選ぶかが本当の論点です。

なぜMarkdownを選ばなかったか

Markdownは書きやすさで圧倒的です。それでも見送ったのは、ブログ記事に求める要素がMarkdownの文法で素直に表現できない場面が多すぎたからです。

具体的に困る場面を挙げると、

  • 商品紹介ボックス(Rinkerショートコード)の挿入
  • 構造化データ(JSON-LD)の埋め込み
  • アコーディオン、タブ、注釈ボックスなどのリッチUI
  • 画像の細かい指定(alt、loading属性、figure要素)
  • 内部リンクのrel属性指定

Markdownで書こうとすると、結局HTMLを混ぜて書くことになります。混ざった結果、Markdown部分とHTML部分が入り乱れる原稿は、機械的にパースしにくくなります。

最初からHTMLで書けば、この分岐は消えます。書きやすさは確かに落ちますが、変換レイヤーの単純さと引き換えなら受け入れられる、と判断しました。

もう一点、Claude Codeで原稿を編集する場合の挙動も決め手になりました。Markdownの拡張記法は実装によって解釈が分かれます。HTMLは仕様が明確で、AIに編集を任せても結果がぶれにくい。長期運用する自動化基盤では、この仕様の明確さが効いてきます。

YAMLフロントマターに何を入れるか

原稿の冒頭にYAMLブロックを置いて、記事に紐づくメタデータをすべてここに集約します。本文の中にメタデータが散らばらないことが、後段の機械処理の前提です。

ポイントは、人間が書いて意味のあるものだけを入れることです。生成可能な情報(記事のwords countや読了時間など)は入れません。それらは変換時に自動で算出するか、表示時にJavaScriptで計算します。

フロントマターに入れる情報の判断基準は二つです。

  • 執筆者が指定しないと決まらないか:カテゴリ・タグ・構造化データ種別はYes
  • 本文を読んでも自動で決められないか:商材ID、hreflangはYes

この二つを満たすものだけがフロントマター行きで、残りは本文か変換ロジックに置きます。

人間が書く領域と機械が読む領域

HTML+YAML方式の核心は、書き手と機械の役割分担を物理的にファイル内で分けたことです。

書き手が本文で頑張るのはHTML部分だけ。フロントマターは「設定ファイル」と割り切ります。一方、機械(変換スクリプト、AI、テンプレートエンジン)はフロントマターを参照して機械的な処理を完結させ、本文には触らない。

この境界を厳密に守ると、執筆中に余計なことを考えずに済みます。SEO設定を本文に埋め込もうとしたり、構造化データを手書きしようとする誘惑がなくなる。境界が明示されているから境界を守れる、という構造です。

逆に、ブロックエディタやNotionのように、コンテンツとメタデータが画面上で区別しづらいツールでは、この分離が崩れていきます。一年運用するとメタデータの粒度がバラついて、検索精度や構造化データの効果が落ちる、というのが他のブロガーから聞く失敗パターンです。

設計時に却下した代替案

主な却下案はMarkdownでしたが、もう一つだけ検討した案を残します。

案:MDX(Markdown + JSXコンポーネント)

MarkdownにReactコンポーネントを埋め込めるMDXも候補でした。リッチUIをコンポーネント化して再利用できる魅力があります。

却下した理由は、WordPress配信との不整合です。MDXはNext.jsやAstroなど静的サイトジェネレーターを前提にした形式で、WordPressのテーマ・プラグインエコシステムとは噛み合いません。Reactランタイムを別途読み込ませる構成も、表示速度とSEOの観点で現実的ではありませんでした。

新規にヘッドレス構成で作るならMDXは強い選択肢ですが、既存WordPressに乗せる前提では合いません。

案:JSON原稿

機械処理に最適化するなら、原稿そのものをJSONで持つ案も理屈の上ではあります。

却下した理由は単純で、人間が書けないためです。書き手が直接書く形式である以上、書きやすさは譲れません。JSONは変換後の中間形式としては使いますが、原稿の保存形式にはしません。

このシリーズで何度も戻ってくる原則

ここまでに繰り返し出てきた原則を明示化しておきます。機械が読みやすいフォーマットと、人間が書きやすいフォーマットを、無理に一つにしない。一つのファイル内でも、領域を分ければ両立できます。

これはCLAUDE.md三層構造(第2回)にも、この後扱うwp_import.pyの設計(第4回)にも、同じ形で出てきます。

次回予告

次回からは二回連続で wp_import.pyの実装解説 を扱います。前編はHTMLとYAMLの分解、画像参照の置換、JSON-LDの生成まで。後編はRinkerショートコード展開、REST API投稿、エラー処理、冪等性の確保まで。原稿レイヤーから連携レイヤーへ橋渡しする部分のコードを、設計判断とあわせて解説します。


このシリーズで紹介する設計は、執筆時点の各ツールバージョンに基づきます。Claude Code、MCP、WordPress、各種APIは仕様変動が大きいため、最新ドキュメントとの照合をおすすめします。

広告