出力タブ — Schema.org ヘッダ/フッタ・ホームイントロ

md サブドメインで配信される Markdown の出力フォーマットを制御するタブです。LLM ネイティブ Markdown インライン Schema.org 記法によるヘッダ/フッタブロックの ON/OFF と、ホーム/フロントページに挿入するイントロ Markdown を設定します。

概要

「出力」タブは WordPress 管理画面 → LLMO Markdown → 出力 でアクセスできるタブです (URL: /wp-admin/admin.php?page=kashiwazaki-llmo-md&tab=output)。Markdown 本文に AI クローラ向けの構造情報をどう載せるかを決めます。

このタブには 5 種類の設定項目があります:

  1. Schema.org ヘッダブロック — 本文先頭に Article/WebPage/BreadcrumbList などのインライン Markdown ブロックを出力するか
  2. Schema.org フッタブロック — 本文末尾に著者 (Person) とサイト所有者 (Organization) のブロックを出力するか
  3. メイン側 md 並行版リンク (alt-link) — メインサイトの HTML レスポンスに HTTP Link: ヘッダ + HTML <link> タグで md 並行版への参照を出力するか
  4. md ホーム用イントロ Markdown — ホーム/フロントページの Markdown に挿入するイントロテキスト
  5. サブディレモード (root インデックス配信) v1.0.3 で追加 — WP がサブディレクトリインストール (例: example.com/wp/) のとき、md ホスト root (md.example.com/) にインデックスページを配信

画面構成

出力タブの全景
図: 出力タブの全景。Schema.org ヘッダ/フッタの 2 つの ON/OFF と、ホームイントロ用の textarea で構成されています。
出力タブの概念図
図: 出力タブの概念図 — Markdown 本文の前後に Schema.org ブロック (Markdown インライン Schema.org 記法) が挟み込まれる構造。

UI 部品の対応表

セクション UI 部品 option key デフォルト
Schema.org ヘッダブロック checkbox enable_schema_header (bool) true (チェック済)
Schema.org フッタブロック checkbox enable_schema_footer (bool) true (チェック済)
メイン側 md 並行版リンク (alt-link) checkbox enable_md_alternate_link (bool) true (チェック済)
md ホーム用イントロ Markdown textarea (large-text code) home_intro_markdown (string) 空 (未設定)
サブディレモード — マスタースイッチ checkbox subdir_mode_enabled (bool) false (OFF)
サブディレモード — 配信モード radio (2 択) subdir_mode_type ('auto' | 'custom') 'auto'
サブディレモード — カスタムコンテンツ textarea (large-text code、最大 256KB) subdir_mode_content (string) 空 (未設定)

Markdown インライン Schema.org 記法とは

従来の WordPress では Schema.org の構造化データを JSON-LD<script type="application/ld+json"> として HTML に埋め込むのが一般的です。本プラグインは md サブドメイン専用なので、JSON-LD ではなく Markdown のインラインで Schema.org の type / property を表記 します。これは Schema.org の公式構造化データ形式 (JSON-LD / Microdata / RDFa) ではありませんが、AI クローラ向け GEO/LLMO 実装で採用されている記法で、柏崎剛が提唱する LLM ネイティブサブドメインの中核となる出力形式です。

例 — singular (Article) の Markdown 出力

> **@type**: Article
> **headline**: 「LLMO 対策の最前線」
> **url**: https://www.example.com/2026/04/30/llmo-frontline/
> **datePublished**: 2026-04-30
> **author**: Jane Doe
> **inLanguage**: ja

# LLMO 対策の最前線

(本文 Markdown ...)

---

> **@type**: Person
> **name**: Jane Doe
> **url**: https://www.example.com/author/jane-doe/

> **@type**: Organization
> **name**: Example Inc.
> **url**: https://www.example.com/

blockquote 内に **プロパティ名**: 値 の行を並べる形式で、AI クローラ (LLM) は markdown の文脈と Schema.org の語彙を同時に読み取れます。JSON-LD と違い、人間が読んでも違和感なくコンテンツに溶け込みます。

なぜ JSON-LD ではないのか

Schema.org ヘッダブロック

本文の先頭 (H1 タイトルの前) に Markdown インライン Schema.org 引用ブロックを出力する設定です。

挙動の詳細

個別ページ (singular) でのヘッダ内容

個別記事や固定ページでは、md-schema-mapper.php が以下のフィールドを生成します:

Schema property 値の元
@type Schema.org タブの post_type マッピング (デフォルト: post → Article, page → WebPage)
headline get_the_title( $post )
url seo (www) 側の正規 URL — md_host ではない点に注意
datePublished $post->post_date
dateModified $post->post_modified (post_date と異なる場合のみ)
author get_the_author_meta( 'display_name' )
inLanguage 言語タブの設定値、未指定なら get_locale() の BCP47 形式

archive / route でのヘッダ内容

一覧ページでは route 種別に応じて生成されるフィールドが変わります。例えば category route なら:

> **@type**: CollectionPage
> **name**: ニュース
> **url**: https://www.example.com/category/news/
> **inLanguage**: ja

各 route の typed Schema は includes/md-route-renderers.php 内の各 renderer 関数で組み立てられ、最終的に ksmd_route_schema_header_lines filter を通って配列の文字列群として渡されます。

BreadcrumbList の付与

singular で post が階層構造を持つ場合 (例: 親 page を持つ child page、CPT で has_archive がある場合)、ヘッダブロックには BreadcrumbList も追加されます:

> **@type**: BreadcrumbList
> **itemListElement**:
>   1. ホーム — https://www.example.com/
>   2. ニュース — https://www.example.com/category/news/
>   3. (現在のページ)

Schema.org フッタブロック

本文の末尾に著者 (Person) とサイト所有者 (Organization) のブロックを出力する設定です。

挙動の詳細

Person ブロック

> **@type**: Person
> **name**: Jane Doe
> **url**: https://www.example.com/author/jane-doe/

著者の値は get_the_author_meta() から取得します。namedisplay_nameurl は author archive URL です。

Organization ブロック

> **@type**: Organization
> **name**: Example Inc.
> **url**: https://www.example.com/

nameget_bloginfo( 'name' )urlhome_url() から取得されます。

💡 Tip

サイトのスポンサー / 運営会社 / NPO 種別をより細かく示したい場合は ksmd_route_schema_footer_lines filter で行を上書きしてください。LocalBusinessNewsMediaOrganization などより具体的な type に変更可能です。

メイン側 md 並行版リンク (alt-link)

メインサイト (例: example.com) の HTML ページ配信時に、対応する md 並行版 (例: md.example.com/posts/foo) への参照を HTTP Link: ヘッダHTML <head><link> タグ の両方で出力する設定です。AI クローラ (GPTBot / ClaudeBot / PerplexityBot 等) が HTML を fetch した時点で md 並行版の存在を発見できるようにします。

メイン側 alt-link で md 並行版を AI クローラに告知する流れ
図: alt-link の流れ — メイン HTML レスポンスに Link: ヘッダ + <link> タグ追加 → AI クローラが md URL を発見 → md 並行版にアクセス。HTML body は完全非改変。

挙動の詳細

出力対象の制約

以下の条件をすべて満たすときのみヘッダ/タグが出力されます:

実装位置

includes/md-alternate-link.php で定義。template_redirect アクション (priority 10) で HTTP ヘッダを送出、wp_head アクション (priority 10) で HTML タグを出力。send_headers ではなく template_redirect を使用するのは、is_singular() 等の conditional tag が WP_Query 確定後でないと正しく動作しないため。

Tip: AI クローラが Link ヘッダを実際に discovery に使うかは公式 docs に明記がない (GPTBot / ClaudeBot / PerplexityBot / Google-Extended いずれも未明記)。本機能は「discovery hint」を増やす目的で実装されており、効果は実観測 (サーバログで md URL への遷移 crawl を確認) で検証してください。

備考: HTML body には一切書き込まないため「メインサイトの既存出力は一切改変しない」原則を満たします (HTTP ヘッダと <head><link> タグのみ)。

md ホーム用イントロ Markdown

md サブドメインのホーム / フロントページで、サイトの H1 直後に挿入するイントロ Markdown テキストです。

なぜこの設定が必要か

WordPress のフロントページは多くの場合、テーマがウィジェットや block editor のブロック、ACF の独自フィールドなどでリッチに構成しています。これらの「テーマ生成リッチコンテンツ」は post_content に格納されておらず、本プラグインは抽出できません。そのためテーマでのフロントページ表示の代わりに、AI クローラ向けの簡潔な紹介文をここに書く運用になります。

フォールバック

このフィールドが空欄の場合、blogdescription オプション (WordPress の「キャッチフレーズ」) が代替として使用されます:

// includes/md-route-renderers.php (抜粋)
$intro_raw = $home_intro_md !== ''
    ? $home_intro_md
    : (string) get_bloginfo( 'description' );

$intro_md = (string) apply_filters(
    'ksmd_home_intro_markdown',
    $intro_raw,
    $context
);

記法

textarea には純粋な Markdownを書けます。HTML タグは使えません (DOMDocument パイプラインを通らないため)。

## 当サイトについて

Example.com は、テクノロジー業界の最新ニュースと専門家インタビューを発信する独立系メディアです。
2010 年創刊。月間 200 万 PV、専属ライター 12 名。

## 主な扱い領域

- 機械学習・LLM の最新動向
- スタートアップ資金調達ニュース
- 開発者向けツールレビュー

## 問い合わせ

編集部宛: editorial@example.com

長さの目安

サブディレモード (root インデックス配信) v1.0.3

WordPress 本体が サブディレクトリインストール されている (例: example.com/wp/ に WordPress が置かれている) サイトでは、md サブドメイン側の root (https://md.example.com/) にアクセスしても、WP の home_path (/wp) と一致せず resolver が 404 にフォールバックする問題があります。本機能は md ホスト root の URI=='/' の到達 を検知して短絡 (short-circuit) し、専用のインデックスページを Markdown で配信します。

UI 画面 (動作する環境 — サブディレ install + 別 md ホスト)

出力タブ — サブディレモードセクション (動作中)
図: WP がサブディレクトリインストール (例: example.com/subdir/) で md ホストが別ホスト名で動いている環境では、警告 box は表示されず通常 UI が出ます。マスタースイッチ ON、配信モード auto 選択中の状態。

UI 画面 (動作しない環境 — 前提条件不成立で制御発動)

出力タブ — サブディレモードセクション (前提条件不成立警告)
図: WP がルート install (例: example.com/ 直下) や md_host == home_host の環境では、UI 上部に「⚠️ 現在の環境ではサブディレモードは動作しません」と環境チェック警告が表示されます。設定値は保存できますが、実行時に root short-circuit が発動せず副作用ゼロ。サブディレクトリ運用ではない場合に誤って ON にされても、本制御で誤動作を防ぎます。

💡 環境別の挙動 (前提条件 enforcement)

WP 設置形態 md_host とメインホストの関係 UI 実行時挙動
サブディレクトリ install (例: example.com/subdir/) md_host ≠ home_host 通常 UI マスター ON で root short-circuit 発動
サブディレクトリ install md_host == home_host (両方 example.com) ⚠️ 警告 + 通常 UI マスター ON でも実行時に発動しない
ルート install (例: example.com/ 直下) md_host ≠ home_host ⚠️ 警告 + 通常 UI マスター ON でも実行時に発動しない
ルート install md_host == home_host ⚠️ 警告 + 通常 UI マスター ON でも実行時に発動しない

環境チェックは UI 表示時 (admin 画面)リクエスト処理時 (root short-circuit) の 2 段で行われます。「設定保存できるが動かない」状態は意図したフェールセーフで、サブディレクトリ運用以外の環境で誤って ON にされても何も起きません。

2 つの配信モード

モード用途生成内容canonical
auto (推奨、デフォルト) サブディレ環境で自動生成のインデックスを配信したい subdir 専用 renderer (ksmd_render_subdir_root_auto()) で「サイト概要」「最近の Markdown コンテンツ一覧」「sitemap.xml 誘導」「メインサイトリンク」を自動生成。「このドメインは {parent} の Markdown 並行版を配信している」という parallel mirror 宣言が含まれる。 home_url('/') (= メインサイトの WP ルート) を Link: rel="canonical" で出力
custom 独自にインデックス Markdown を編集したい subdir_mode_content textarea のテキストを そのまま配信 (Markdown source は wp_kses_post を通さず純粋な Markdown として保存・配信)。最大 256KB 出力しない (該当ページがメインサイトに存在しない可能性が高いため、誤った canonical を返さない安全側設計)

⚠️ 動作の前提条件 (発動条件 enforcement)

このマスタースイッチを ON にしても、以下を満たさない環境では実行時に再チェックして発動しません (副作用ゼロ保証):

WP がルート install (例: example.com 直下) の場合や、md ホストとメインホストが同一の場合、設定値はそのまま保存されますが ksmd_subdir_mode_handle() は呼ばれず通常 resolver 経路を通ります。「設定保存可だが実行時に発動しない」状態です。出力タブの UI は環境チェック結果を warning 表示します (該当環境では「⚠️ 現在の環境ではサブディレモードは動作しません」のメッセージが出ます)。

auto モードの出力例

https://md.example.com/ (md ホスト root) にアクセスすると以下のような Markdown が返ります:

# サイト名

> **Canonical:** https://www.example.com/wp/
> This Markdown is the AI-optimized parallel mirror of https://www.example.com/wp/. ...

> **@type**: WebSite
> **name**: サイト名
> **url**: https://md.example.com/
> **inLanguage**: ja

## サイト概要

(blogdescription)

## 最近の Markdown コンテンツ

- [記事タイトル A](<https://md.example.com/2026/04/30/foo/>) — 2026-04-30 / post
- [記事タイトル B](<https://md.example.com/2026/04/29/bar/>) — 2026-04-29 / post
...

## アーカイブ

サイト全体のサイトマップ: [sitemap.xml](<https://md.example.com/sitemap.xml>)

## メインサイト

このドメインは [https://www.example.com/wp/](<https://www.example.com/wp/>) の Markdown 並行版を配信しています。
...

> **@type**: Organization
> **name**: サイト名
> **url**: https://www.example.com/wp/

Markdown link は CommonMark 準拠の angle-bracket 形式 [label](<url>) で出力されるため、URL に ) が含まれていてもリンク構造が破綻しません。

custom モードの活用例

auto モードの自動生成では足りない場合 (LP 風のサイト紹介、複数事業の一覧、AI クローラへ強調したい情報を載せたい場合等) は custom モードで raw Markdown を直接書きます。Content-Type は text/markdown で配信されるため、ブラウザは HTML として解釈しません。HTML タグも書けますが、AI クローラ向けには Markdown のみで十分です。

# Example Inc. — AI 専門メディア

## 当社について

Example Inc. は 2010 年創業の AI 業界専門メディア。月間 200 万 PV、専属ライター 12 名。

## 主要セクション

- [最新ニュース](<https://md.example.com/category/news/>)
- [技術解説](<https://md.example.com/category/tech/>)
- [インタビュー](<https://md.example.com/category/interview/>)

## 連絡先

editorial@example.com

キャッシュバイパス (Test renderer 互換)

サブディレモードの cache key は 通常 route と完全に分離されています (prefix ksmd_md_subdir_root_)。診断タブの Test renderer や bootstrap installer から手動でキャッシュをリフレッシュしたい場合は以下の 2 経路をサポート:

関連 filter — ksmd_subdir_mode_md_scheme

md ホストの root URL を構築するときの scheme (http / https) を上書きできる filter です。reverse proxy 環境やメインホストと md ホストで scheme が異なる場合に有効です。

// 例: 強制 https
add_filter( 'ksmd_subdir_mode_md_scheme', function( $scheme, $md_host, $opts ) {
    return 'https';
}, 10, 3 );

filter が呼ばれる前のデフォルト解決順序: wp_parse_url( home_url(), PHP_URL_SCHEME ) → 不正値時のみ is_ssl() フォールバック。

💡 サブディレモードを使うべきケース

Markdown 変換ルール (固定)

md 配信での Markdown 化は DOMDocument ベースの自前実装で、以下の7 ルールに固定されています:

HTML 要素 Markdown 出力
h1h6 #######
p 段落
ul / ol / li - / 1.
a[href] [text](url)
strong / b / em / i **...** / *...*
blockquote > ...
pre / code ```...```
img[src][alt] ![alt](src)

完全除外される要素

以下の要素はノイズとみなされて Markdown 化から除外されます:

カスタマイズ — ksmd_render_node filter

独自 HTML 要素を追加で対応したい場合は ksmd_render_node filter で各 DOM ノードのレンダリング結果を上書きできます。

add_filter( 'ksmd_render_node', function( $rendered, $node, $depth ) {
    // 例: <table> を Markdown table に変換 (ライブラリ実装は読者で)
    if ( $node->nodeName === 'table' ) {
        return convert_html_table_to_markdown( $node );
    }
    return $rendered;
}, 10, 3 );

内部挙動 — 設定値の読まれ方

singular renderer での flow

  1. md-renderer.phpksmd_render_singular() が起動
  2. $opts['enable_schema_header'] を確認 → ヘッダ blockquote の生成可否
  3. md-schema-mapper.php で post_type に応じた Schema.org type を決定
  4. 本文 Markdown を DOM 経由で変換
  5. $opts['enable_schema_footer'] を確認 → Person/Organization フッタの生成可否
  6. 結合して最終 Markdown を返す

home renderer での flow

  1. ksmd_render_home_route() が起動
  2. サイト H1 を get_bloginfo( 'name' ) で取得
  3. $opts['home_intro_markdown'] を確認 — 空なら get_bloginfo( 'description' ) でフォールバック
  4. ksmd_home_intro_markdown filter を通して最終値を取得
  5. 各 archive route へのリンク群を生成 (filter ksmd_home_archive_links)
  6. 最新投稿リスト (filter ksmd_home_recent_post_type) を生成

関連 filter

ksmd_home_intro_markdown

/**
 * @param string $intro    現在のイントロ Markdown
 * @param array  $context  コンテキスト
 * @return string  最終 Markdown
 */
add_filter( 'ksmd_home_intro_markdown', function( $intro, $context ) {
    // 言語別に動的差し替え
    if ( get_locale() === 'en_US' ) {
        return "## About\n\nWelcome to the English version.";
    }
    return $intro;
}, 10, 2 );

ksmd_route_schema_header_lines

/**
 * @param array  $lines    blockquote 行の配列 (各要素は文字列)
 * @param string $type     Schema.org type (例: Article, CollectionPage)
 * @param string $headline 見出し文字列
 * @param string $url      canonical URL
 * @param array  $context  コンテキスト
 */
add_filter( 'ksmd_route_schema_header_lines', function( $lines, $type, $headline, $url, $context ) {
    // 自前 publisher 情報を追加
    $lines[] = '> **publisher**: Example Media Inc.';
    return $lines;
}, 10, 5 );

ksmd_route_schema_footer_lines

add_filter( 'ksmd_route_schema_footer_lines', function( $lines ) {
    // sameAs を追加
    $lines[] = '> **sameAs**: https://twitter.com/example';
    $lines[] = '> **sameAs**: https://www.linkedin.com/company/example';
    return $lines;
} );

typical configurations

パターン A — 標準 (両方 ON)

用途: ほとんどのサイトで推奨される設定。Schema.org 情報をフルに付与して AI クローラに最大の手がかりを与える。

パターン B — 軽量 (フッタのみ)

用途: 本文がそのまま重要 (例: ニュース速報) で、ヘッダの構造化が冗長と感じる場合。

パターン C — プレーン (両方 OFF)

用途: 完全プレーンな Markdown 出力で、外部ツール (静的サイトジェネレータ等) で再構成したい場合。

パターン D — リッチ (filter で publisher 拡張)

用途: NewsMediaOrganization としての E-E-A-T 強化、SNS 連動 (sameAs) の明示。

よくある質問

Q. JSON-LD で出力できないか?

A. 本プラグインは Markdown インライン記法に振り切った設計です。JSON-LD は md サブドメインでは想定外。メインサイト (www) 側で JSON-LD を出すには Yoast SEO 等の既存 SEO プラグインを併用してください — 役割分担します。

Q. url が md_host ではなく www になっているのはなぜ?

A. canonicalness は seo (www) 側に帰属させる設計だからです。md サブドメインは並行版 (parallel rendering) であり、検索エンジンの canonical signal は www へ渡します。AI クローラから見ても、最終的に人間が訪問する URL は www が望ましいためです。

Q. ヘッダブロックを ON にすると本文の H1 が消える?

A. いいえ。ヘッダ blockquote → H1 → 本文 → フッタ blockquote の順で並びます。H1 は常に出力されます。

Q. ホームイントロ Markdown はサイト全体で 1 つしか持てない?

A. このフィールドは 1 つです。ただし ksmd_home_intro_markdown filter で動的に差し替え可能なので、locale や route の context によって振り分け実装ができます。

Q. ホームイントロ Markdown が反映されない

A. キャッシュが残っている可能性が高いです。「キャッシュタブ」から全 flush してください。または md ホーム URL を直接訪問する際にブラウザキャッシュも疑ってください。

Q. blockquote 記法 (> **name**: value) は LLM が確実に解釈する?

A. ChatGPT / Claude / Perplexity / Gemini はすべて Markdown を fluent に解釈します。Schema.org の語彙 (Article, BreadcrumbList 等) は学習データに豊富にあるため、blockquote の中でも意味を正しく抽出できる傾向が観察されています。ただし将来的に LLM が変わる可能性はあるため、フィードバックがあれば filter で形式変更してください。

Q. table を Markdown 化できる?

A. デフォルトでは未対応です。ksmd_render_node filter で table ノードを自前変換すれば可能です (パイプ table 記法は AI クローラからも解釈されます)。

関連