5 分クイックスタート

最短で md サブドメイン配信を立ち上げるための手順です。 事前に DNS とサーバの土台が用意できていれば、所要時間 5〜10 分程度で https://md.example.com/ にアクセスして Markdown が返る状態まで持って行けます。

前提条件

本クイックスタートは 「DNS と SSL の準備が完了している」「md ホスト用の HTTP リクエストが WordPress に届く状態である」 を前提としています。これらが未準備の場合は先に DNS と Bootstrap を読んでセットアップしてください。

必要な環境

項目 要件
WordPress 6.1 以上 (Tested up to: 6.7)
PHP 7.4 以上 (PHP 8.x でも動作)
md サブドメイン md.example.com 等。DNS で WordPress サーバへ向け済み
サーバ構成 md サブドメインのドキュメントルートが「兄弟構成」または「ABSPATH 直下サブディレクトリ構成」で WordPress に紐付け可能
SSL 証明書 md サブドメインに対する有効な証明書 (推奨。Let's Encrypt 等)
権限 WordPress 管理画面に manage_options 権限でログインできること (= 管理者ユーザ)

⚠ サブドメインの DNS が無いと動きません

このプラグインは「md サブドメインへのリクエストが WordPress まで届くこと」 を絶対の前提にしています。 プラグインを有効化しただけでは、サブドメインの DNS が向いていなければ https://md.example.com/ は WordPress にすら到達せず、ブラウザ側でエラーになります。 先に DNS とサーバ側のバーチャルホスト追加を完了させてください。

このページの全体像

これから次の 7 ステップを実施します。

  1. プラグインインストール
  2. md サブドメインの DNS 設定 (簡略)
  3. プラグイン設定画面を開く
  4. 一般タブで md_host を設定 + master switch ON
  5. Bootstrap installer で md ホスト用 index.php を自動生成
  6. Test renderer で出力プレビュー
  7. ブラウザで https://md.example.com/ にアクセス

それぞれ実時間 30 秒〜2 分で済みます。詰まったら各ステップ末尾の「うまく動かないとき」 を参照してください。

Step 1: プラグインインストール

プラグインを WordPress にインストールして有効化します。この段階では md サブドメインに何もレスポンスは返りません (master switch が default OFF のため、503 が返る)。

1

プラグイン本体の zip (wp-plugin-kashiwazaki-llmo-md-subdomain.zip) を取得します。 GitHub リリースまたは配布元から最新の v1.0.1 をダウンロードしてください。

2

WordPress 管理画面の「プラグイン」 → 「新規追加」 → 「プラグインのアップロード」 から zip をアップロードするか、 手動で zip を解凍して wp-content/plugins/wp-plugin-kashiwazaki-llmo-md-subdomain-main/ に配置します。

3

プラグイン一覧画面で 「Kashiwazaki LLMO Markdown Subdomain」 を有効化します。 プラグイン行の「停止」横に「設定」 リンクが追加されることを確認してください。

プラグイン一覧で本プラグインを有効化した直後の行表示。停止 / 設定 / バージョン情報が並ぶ
プラグイン一覧での表示。「設定」リンクから設定画面に直接ジャンプできる

💡 補足

有効化時に WordPress オプション ksmd_settings が初期 default 値で作成されます (kashiwazaki-llmo-md-subdomain.phpksmd_on_activate())。 旧バージョンの kashiwazaki_llmo_md_settings がある場合は自動マイグレーションされます。 有効化のみではメインサイト・md サブドメインのいずれにも何の出力変化もありません。

Step 2: md サブドメインの DNS 設定

既に DNS が md.example.com を WordPress サーバへ向けている場合はこのステップはスキップしてください。 未設定の場合は概略を以下に示します。詳細は DNS と Bootstrap ページを参照してください。

必要な DNS レコード

シナリオ レコード種類 設定例
専用サーバ / VPS で固定 IPv4 がある A md IN A 203.0.113.10
共用サーバで「メインサイトと同じホスト名にしたい」 CNAME md IN CNAME example.com.
IPv6 にも対応したい AAAA md IN AAAA 2001:db8::1
Cloudflare 経由でフル代理 A or CNAME (Proxied) Cloudflare ダッシュボードの DNS タブで「Proxied」 ON。WAF / Bot Fight Mode に注意

サーバ側の設定

DNS だけでは不十分で、Web サーバ (Apache / Nginx / LiteSpeed) 側で md.example.com のドキュメントルートを WordPress と同じインストールに紐付ける 必要があります。 一般的なやり方は次のいずれかです。

このプラグインは 「兄弟構成」「ABSPATH 直下サブディレクトリ構成」 の 2 種類のレイアウトを Bootstrap installer でサポートしています。 どちらに該当するかは Step 5 で自動判定されます。

SSL 証明書

HTTPS で運用したい場合 (推奨)、md サブドメインに対する SSL 証明書を発行してください。 Let's Encrypt の DNS-01 / HTTP-01 認証で発行できます。 メインサイトが HTTP (http://) で運用されている場合は、md ホストも自動的に HTTP になります (ksmd_md_scheme filter で変更可能)。

Step 3: プラグイン設定画面を開く

プラグインを有効化すると、WordPress 管理画面のサイドバーに専用メニューが追加されます。

管理画面 URL

/wp-admin/admin.php?page=kashiwazaki-llmo-md

プラグインのトップレベルメニューは 「設定」直下の position 81 に配置されます。 アイコンは dashicons-text-page。実コードの該当箇所は次の通りです。

// admin/admin-loader.php
add_menu_page(
    __( 'Kashiwazaki LLMO Markdown Subdomain', '...' ), // page_title
    __( 'Kashiwazaki LLMO Markdown Subdomain', '...' ), // menu_title
    'manage_options',                                    // capability
    'kashiwazaki-llmo-md',                               // menu_slug
    'ksmd_render_settings_page',                         // callback
    'dashicons-text-page',                               // icon
    81                                                   // position
);
WordPress 管理画面のサイドバー上の本プラグインの位置 (設定の下)
左サイドバーの「設定」直下にトップレベルメニューが追加される

7 タブ構造

設定画面は次の 7 タブで構成されています (詳細は各タブのページ参照)。

  1. 一般: master switch / kill switch / md_host (このページ Step 4 で扱う)
  2. 対象範囲: post_type と route の ON/OFF
  3. 出力: Schema header/footer / home_intro
  4. Schema.org: post_type ごとの type マッピング
  5. キャッシュ: backend と TTL
  6. 言語: inLanguage の自動算出と明示指定
  7. 診断: Test renderer / アクセスログ / 互換性チェック / Bootstrap installer / Export Import

Step 4: 一般タブ — md_host 設定

設定画面の「一般」 タブで md ホスト名を確認・調整し、master switch を ON にします。

一般タブの全景。プラグインを有効化チェック / md サブドメインのホスト名 / kill switch / 動作確認リンク
一般タブの全景

md サブドメインのホスト名

「md サブドメインのホスト名」入力欄に、Step 2 で設定したサブドメインを入力します。 空欄のまま保存すると home_url() から「md. + メインホスト (www. 除去後)」が自動算出されます (実装は ksmd_default_md_host())。

メインサイト URL 自動算出される md ホスト
https://example.com/md.example.com
https://www.example.com/md.example.com (www. 除去後)
https://blog.example.co.jp/md.blog.example.co.jp
http://localhost/md.localhost (開発環境)

master switch を ON にする

1

「プラグインを有効化」 のチェックボックスをオンにします (= master switch ON)。

2

「一般設定を保存」 ボタンをクリック。

一般タブの master switch + md_host 入力欄の拡大
master switch (プラグインを有効化) と md_host 入力欄

これで「md サブドメインで Markdown を配信する」状態に切り替わりました。ただしこの段階ではまだ Step 2 の DNS / Step 5 の Bootstrap が完了していないと、ブラウザからアクセスしても応答が得られません。

kill switch (緊急停止) について

画面下部の 🛑 kill switch ボタンは、運用中に何か問題が起きた時の 1 クリック緊急停止 です。 ON にすると md サブドメインへの全リクエストに HTTP 503 を返し、すべての ksmd キャッシュをフラッシュします。 メインサイト (www) には一切影響しません。Step 4 では使いません (default OFF のまま)。

💡 保存時の挙動

md_host や master switch などの値が変わると、admin/admin-loader.phpupdate_option_ksmd_settings アクションフックが ksmd_cache_flush_all() を呼んで全キャッシュを自動フラッシュします。 古い設定で生成された Markdown が残らないので、保存後すぐにブラウザで再確認できます。

Step 5: Bootstrap installer で md ホスト用 index.php 自動生成

md サブドメインのドキュメントルートに 「メインの WordPress に橋渡しする index.php を配置します。 このプラグインは SSH 不要・サーバへのファイル直接編集不要 でこの作業を完結できる Bootstrap installer を備えています。

診断タブを開く

設定画面の上部タブから「診断」 をクリック → 「md ホストブートストラップ」セクションまでスクロール。

診断タブの md ホストブートストラップセクション全景
診断タブ: md ホストブートストラップセクション

md ドキュメントルートのパスを入力

1

「md ドキュメントルート」の入力欄に、Step 2 でサーバ側に作った md サブドメイン用ドキュメントルートの絶対パス を入力します。

例: /home/example/public_html/md (XServer 標準) / /var/www/html-md (兄弟構成) など。

2

「パスを保存」ボタンをクリック。

3

「状態を確認」 ボタンで、入力パスが「兄弟構成」または「ABSPATH 直下サブディレクトリ構成」 のどちらに該当するかを判定します。 8 段階の hard gate チェック (絶対パスか / ディレクトリか / 書き込み可能か / WP コアディレクトリと衝突しないか / wp-blog-header.php に到達するか / probe ファイルが書けるか 等) が走ります。

md ホストブートストラップの操作ボタン (パスを保存 / 状態を確認 / index.php を生成 / index.php を削除)
Bootstrap installer の操作ボタン群

index.php を生成

4

状態確認で「OK」が出たら、「index.php を生成」 ボタンをクリック。

生成される index.php は次の 3 行 PHP で構成されます (実装: md-bootstrap-installer.phpksmd_bootstrap_generate_template())。

<?php
/**
 * KSMD-BOOTSTRAP-MARKER v1
 * Generated by wp-plugin-kashiwazaki-llmo-md-subdomain on 2026-04-30T...
 * Do not edit manually. Use plugin admin UI to regenerate or remove.
 */
define( "WP_USE_THEMES", true );
require __DIR__ . "/../wp-blog-header.php";  // subdir 構成
// または
// require __DIR__ . "/../wp/wp-blog-header.php";  // sibling 構成

この 3 行が「md サブドメインに来たリクエストを WordPress に橋渡し」 する役割を果たします。 その後 template_redirect priority -1 で本プラグインがリクエストを捕捉し、Markdown を返却します。

3 重マーカーで安全性を担保

生成される index.php には KSMD-BOOTSTRAP-MARKER v1 という識別子が埋め込まれ、 さらに sha256 ハッシュとバージョン文字列の 3 重チェックで「本プラグインが生成したファイルかどうか」 を判定します。 手動編集された index.php や別の WordPress の index.php絶対に上書きしません。 削除時も同じ 3 重チェックがかかり、安全でない場合は警告して削除を中止します。

💡 削除しても 24 時間は復元可能

Bootstrap installer で削除した index.php は、24 時間以内なら「復元」ボタンで戻せます。 内容は ksmd_bootstrap_last_removed_backup オプションに保存されています。 24 時間経過すると自動削除されます。

Step 6: Test renderer でプレビュー確認

実際にブラウザで md ホストにアクセスする前に、管理画面内で出力をプレビューできる Test renderer を使って動作確認します。

診断タブの Test renderer

「診断」 タブの「Test renderer」セクションに、メインサイト側の URL を入力します。 (例: https://example.com/sample-post//sample-post/)

診断タブの Test renderer セクション。URL 入力欄と「テスト実行」ボタンと結果表示エリア
Test renderer: 任意 URL の Markdown 出力をプレビュー
1

URL 欄にメインサイトの記事 URL を入力 (例: https://example.com/sample-post/)。

2

「テスト実行」 ボタンをクリック。サーバ側で wp_remote_get がリクエストを発行し、 HMAC token を X-Ksmd-Test-Token ヘッダで送ることで cookieless かつキャッシュバイパスで Markdown を取得します。

3

結果表示エリアに、その URL に対する md サブドメイン出力 (Markdown 本文) が表示されます。 冒頭に H1 タイトル、Canonical 注記、Schema.org 引用ブロック、本文、末尾に Person / Organization の Schema が並んでいれば成功です。

Test renderer の仕組み

Test renderer は管理者の admin cookie を md サブドメインに送れない (cookieless) 制約を、 wp_salt('nonce') ベースの HMAC-SHA256 token で代替しています。 実装は includes/security.php:

function ksmd_generate_test_token( $uri ) {
    $expires = time() + 300; // 5 分有効
    $payload = $uri . '|' . $expires;
    $sig     = hash_hmac( 'sha256', $payload, wp_salt( 'nonce' ) );
    return base64_encode( $expires . '.' . $sig );
}

md ホスト側 (core-functions.php) では ksmd_verify_test_token() でこのトークンを検証し、 一致すればキャッシュをバイパスして即時再生成して返します。 これにより「キャッシュに残った古い出力ではなく、今この瞬間の最新出力」 を確認できます。

Step 7: ブラウザで md ホストにアクセス

最後に、実際のブラウザから md サブドメインにアクセスして Markdown が返ることを確認します。

1

ブラウザで https://md.example.com/ を開きます (md ホスト名は Step 4 で設定したもの)。

2

text/markdown; charset=utf-8 として Markdown 本文が返れば成功です。 ブラウザによっては Markdown を素のテキストとしてダウンロード扱いするので、 開発者ツールのネットワークタブでステータス 200 と Content-Type を確認するか、 curl -v https://md.example.com/ で確認するのが確実です。

md サブドメインのホーム (https://md.example.com/) で返される Markdown 出力
md サブドメインの home: Markdown インライン Schema.org が出力される

確認すべき HTTP ヘッダ

正しく動作している場合、md ホストのレスポンスには次のヘッダが付きます。

ヘッダ 意味
Content-Type text/markdown; charset=utf-8 レスポンスは Markdown 形式
X-Content-Type-Options nosniff ブラウザに勝手な MIME 推測をさせない
X-Robots-Tag noindex, follow Google 等の検索結果に出さない / リンクは辿る
Cache-Control no-store, no-cache, must-revalidate, max-age=0 Cloudflare 等のエッジキャッシュを抑止
Link <https://example.com/...>; rel="canonical" 主従宣言: 真の URL は seo (www) 側
X-Ksmd-Cache HIT / MISS / NO-CACHE キャッシュ状態のデバッグ情報

メイン側 (例: example.com) のレスポンスにも、本プラグインが ON のとき以下のヘッダが追加されます (alt-link 機能、デフォルト ON、出力タブで OFF 可):

ヘッダ 意味
Link (alt-link) <https://md.example.com/...>; rel="alternate"; type="text/markdown; charset=utf-8" + 同 URL の rel="describedby" md 並行版の存在を AI クローラに告知 (RFC 8288 準拠)

メイン側 HTML <head> 内にも対応する <link rel="alternate"> + <link rel="describedby"> タグが出力されます (取りこぼし防止のため両出し)。curl -sI https://example.com/posts/foo | grep -i ^link で確認できます。

md ホストの favicon リクエスト (/favicon.ico 等 5 URI) は、本プラグインが ON のとき以下のレスポンスを返します (favicon proxy 機能、デフォルト ON、一般タブで OFF 可):

確認用 URL

一般タブ下部の「動作確認」 リストから、以下の 3 つの URL を順にクリックして開いてみてください。

robots.txtsitemap.xml はメインサイト側のものとは別物です (md ホスト用に専用生成)。

個別記事の確認

メインサイトの記事 URL のホスト部分だけを md.example.com に置き換えてアクセスすれば、 その記事の md 版が見られます。例:

md サブドメインで個別記事を表示した例。Article Schema + 本文
md サブドメインの singular (個別記事): Article Schema + Markdown 本文
md サブドメインのアーカイブページ。CollectionPage Schema + 記事リンクリスト
md サブドメインの archive: CollectionPage Schema + 記事リンクリスト

うまく動かないとき

最初のセットアップで遭遇しやすい問題と、対処の入口を以下にまとめます。 詳細は トラブルシューティング ページを参照してください。

症状別のチェックリスト

症状 典型的な原因 確認場所
https://md.example.com/ がブラウザでタイムアウト or DNS エラー Step 2 の DNS 設定が未完 / Web サーバのバーチャルホスト未設定 DNS 管理画面 / サーバの Apache・Nginx 設定
SSL 警告が出る (証明書エラー) md サブドメイン用の SSL 証明書が未発行 Let's Encrypt 等で md ホスト用証明書を発行
HTTP 503 が返り続ける master switch が OFF / kill switch が ON 一般タブの 2 つのスイッチ
HTTP 404 が返る (個別記事のはずなのに) 対象範囲タブで該当 post_type が OFF / 投稿が下書き or 非公開 / URL が誤っている 対象範囲タブ + メイン側の投稿ステータス
md ホストにアクセスするとメインサイト (HTML) が返ってくる Bootstrap installer 未実行 = md ドキュメントルート用 index.php が WordPress 本体の HTML を返している 診断タブの md ホストブートストラップ
HTTP 200 だが Content-Typetext/html md ホスト名が DNS 上は別ドメインだが、サーバ側で同じバーチャルホストに割り当てられている (HTTP_HOST 不一致で no-op) サーバの ServerName / ServerAlias
HTML が壊れた Markdown が返る (構造化データだけで本文が空) テーマや他プラグインの the_content フィルタで予期せぬ HTML が出力されている 診断タブの Test renderer で原因記事を特定

ログ確認

設定タブ「診断」 → 「アクセスログ」を ON にすると、md ホストへの全リクエスト (URI / status / 応答時間 / User-Agent) が {prefix}ksmd_access_logs テーブルに記録されます。 「クローラが来ているのに 404 ばかり」 のような状態を可視化できます。 ログは default 7 日間保持、IP は default 匿名化 (IPv4 末尾オクテット 0、IPv6 /64 マスク)。

互換性チェック

診断タブの「互換性チェック」 セクションでは、PHP バージョン・WP バージョン・必要拡張 (DOMDocument / libxml / mbstring / hash) の有無が一覧表示されます。 セットアップ初期にここで赤色項目が出ていないかを確認してください。

互換性チェック表の拡大。PHP / WP / 各拡張のバージョンと判定が並ぶ
互換性チェック: 項目別に OK / NG が一覧表示される

Cloudflare 経由で 403 が返るとき

md ホストを Cloudflare の Proxied (オレンジ雲) で運用している場合、Bot Fight Mode / WAF / Rate Limiting が AI クローラを弾いてしまうことがあります。 Bootstrap installer の verify でも HTTP 403 / 520-525 が返ったときに「Cloudflare WAF / Bot 判定の可能性」 として警告が出ます。 CF ダッシュボードで md サブドメインの WAF ルールを見直してください。

次のステップ

無事に https://md.example.com/ から Markdown が返るようになったら、 次は運用に必要な設定を順に詰めていきます。以下の 3 ルートをおすすめします。

📚

概念から復習する

基本概念 をもう一度読み、LLMO/GEO・Markdown インライン Schema.org 記法・canonical の扱い・対応 AI クローラ・用語集を腑に落とす。設定タブを触る前に視点が揃う。

セットアップを精緻化

インストール・初期設定 で初期化のしくみと option migration を、DNS と Bootstrap で構成判定ロジックを詳細に確認する。

🎛

設定タブを順に詰める

一般対象範囲出力Schema.orgキャッシュ言語診断 の順に各タブを 1 ページずつ確認。

運用ベストプラクティス (簡略版)

💡 まずは 1 週間観測

セットアップ完了後、まずは 1 週間アクセスログを観測してください。 どの AI クローラがどの記事を、どのくらいの頻度で取得しているかを把握すると、その後の対象範囲タブやキャッシュタブの調整がしやすくなります。 AI 検索ツール側でのインデックス反映には数日〜数週間かかることがあるため、焦らずに継続的なモニタリングを心がけてください。