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 ステップを実施します。
- プラグインインストール
- md サブドメインの DNS 設定 (簡略)
- プラグイン設定画面を開く
- 一般タブで
md_hostを設定 + master switch ON - Bootstrap installer で md ホスト用
index.phpを自動生成 - Test renderer で出力プレビュー
- ブラウザで
https://md.example.com/にアクセス
それぞれ実時間 30 秒〜2 分で済みます。詰まったら各ステップ末尾の「うまく動かないとき」 を参照してください。
Step 1: プラグインインストール
プラグインを WordPress にインストールして有効化します。この段階では md サブドメインに何もレスポンスは返りません (master switch が default OFF のため、503 が返る)。
プラグイン本体の zip (wp-plugin-kashiwazaki-llmo-md-subdomain.zip) を取得します。
GitHub リリースまたは配布元から最新の v1.0.1 をダウンロードしてください。
WordPress 管理画面の「プラグイン」 → 「新規追加」 → 「プラグインのアップロード」 から zip をアップロードするか、
手動で zip を解凍して wp-content/plugins/wp-plugin-kashiwazaki-llmo-md-subdomain-main/
に配置します。
プラグイン一覧画面で 「Kashiwazaki LLMO Markdown Subdomain」 を有効化します。 プラグイン行の「停止」横に「設定」 リンクが追加されることを確認してください。
💡 補足
有効化時に WordPress オプション ksmd_settings が初期 default 値で作成されます (kashiwazaki-llmo-md-subdomain.php の ksmd_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 と同じインストールに紐付ける 必要があります。
一般的なやり方は次のいずれかです。
- シンボリックリンク:
md.example.com用ドキュメントルートを WordPress ディレクトリへの symlink にする - バーチャルホスト追加: Apache / Nginx で
ServerName md.example.comのバーチャルホストを WordPress と同じドキュメントルートに向ける - 共用ホスティングのサブドメイン機能: XServer / wpx / さくらインターネット / ConoHa WING 等のコントロールパネルで「サブドメイン追加」 → ドキュメントルートを 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
);
7 タブ構造
設定画面は次の 7 タブで構成されています (詳細は各タブのページ参照)。
- 一般: master switch / kill switch / md_host (このページ Step 4 で扱う)
- 対象範囲: post_type と route の ON/OFF
- 出力: Schema header/footer / home_intro
- Schema.org: post_type ごとの type マッピング
- キャッシュ: backend と TTL
- 言語:
inLanguageの自動算出と明示指定 - 診断: Test renderer / アクセスログ / 互換性チェック / Bootstrap installer / Export Import
Step 4: 一般タブ — md_host 設定
設定画面の「一般」 タブで md ホスト名を確認・調整し、master switch を ON にします。
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 にする
「プラグインを有効化」 のチェックボックスをオンにします (= master switch ON)。
「一般設定を保存」 ボタンをクリック。
これで「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.php の
update_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 ドキュメントルート」の入力欄に、Step 2 でサーバ側に作った md サブドメイン用ドキュメントルートの絶対パス を入力します。
例: /home/example/public_html/md (XServer 標準) /
/var/www/html-md (兄弟構成) など。
「パスを保存」ボタンをクリック。
「状態を確認」 ボタンで、入力パスが「兄弟構成」または「ABSPATH 直下サブディレクトリ構成」 のどちらに該当するかを判定します。 8 段階の hard gate チェック (絶対パスか / ディレクトリか / 書き込み可能か / WP コアディレクトリと衝突しないか / wp-blog-header.php に到達するか / probe ファイルが書けるか 等) が走ります。
index.php を生成
状態確認で「OK」が出たら、「index.php を生成」 ボタンをクリック。
生成される index.php は次の 3 行 PHP で構成されます (実装: md-bootstrap-installer.php の ksmd_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/)
URL 欄にメインサイトの記事 URL を入力 (例: https://example.com/sample-post/)。
「テスト実行」 ボタンをクリック。サーバ側で wp_remote_get がリクエストを発行し、
HMAC token を X-Ksmd-Test-Token ヘッダで送ることで cookieless かつキャッシュバイパスで Markdown を取得します。
結果表示エリアに、その 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 が返ることを確認します。
ブラウザで https://md.example.com/ を開きます (md ホスト名は Step 4 で設定したもの)。
text/markdown; charset=utf-8 として Markdown 本文が返れば成功です。
ブラウザによっては Markdown を素のテキストとしてダウンロード扱いするので、
開発者ツールのネットワークタブでステータス 200 と Content-Type を確認するか、
curl -v https://md.example.com/ で確認するのが確実です。
確認すべき 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 可):
HTTP/2 302+Location: https://example.com/wp-content/uploads/.../favicon.png(Site Icon にリダイレクト)Cache-Control: public, max-age=86400(1 日キャッシュ)- 例外:
/site.webmanifestのみ動的 JSON 生成 (PWA 互換)
確認用 URL
一般タブ下部の「動作確認」 リストから、以下の 3 つの URL を順にクリックして開いてみてください。
https://md.example.com/— md ホームの Markdown 出力https://md.example.com/robots.txt— md 専用 robots.txt (Sitemap 行を含む)https://md.example.com/sitemap.xml— md 用 sitemap index
robots.txt と sitemap.xml はメインサイト側のものとは別物です (md ホスト用に専用生成)。
個別記事の確認
メインサイトの記事 URL のホスト部分だけを md.example.com に置き換えてアクセスすれば、
その記事の md 版が見られます。例:
- メイン:
https://example.com/articles/foo/ - md 版:
https://md.example.com/articles/foo/
うまく動かないとき
最初のセットアップで遭遇しやすい問題と、対処の入口を以下にまとめます。 詳細は トラブルシューティング ページを参照してください。
症状別のチェックリスト
| 症状 | 典型的な原因 | 確認場所 |
|---|---|---|
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-Type が text/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) の有無が一覧表示されます。 セットアップ初期にここで赤色項目が出ていないかを確認してください。
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 クローラ・用語集を腑に落とす。設定タブを触る前に視点が揃う。
運用ベストプラクティス (簡略版)
- 「対象範囲」 タブで配信したい post_type / route を絞り込む (例:
attachmentはそもそも default 除外、feedやdatearchive は不要なら OFF) - 「キャッシュ」タブで TTL を運用に合わせる (短すぎるとサーバ負荷、長すぎると更新が反映されにくい)
- 「診断」 タブの「アクセスログ」を有効化して、最初の数日は来訪 bot の実態を観測
- 定期的に
https://md.example.com/sitemap.xmlを確認し、AI 検索ツール (Search Console / Bing / Perplexity 等) に md サブドメインを別プロパティとして登録 - 「設定 export / import」 で本番設定をバックアップしておく
💡 まずは 1 週間観測
セットアップ完了後、まずは 1 週間アクセスログを観測してください。 どの AI クローラがどの記事を、どのくらいの頻度で取得しているかを把握すると、その後の対象範囲タブやキャッシュタブの調整がしやすくなります。 AI 検索ツール側でのインデックス反映には数日〜数週間かかることがあるため、焦らずに継続的なモニタリングを心がけてください。