一般タブ — master switch / kill switch / md ホスト名
プラグインの最上位スイッチと、md サブドメインのホスト名を設定するタブです。配信を停止する 2 種類のスイッチ (通常運用の master switch と緊急停止の kill switch) と、md サブドメインのホスト名 (例 md.example.com) を一元管理します。
概要
「一般」タブは WordPress 管理画面 → LLMO Markdown → 一般 でアクセスできるタブです (URL: /wp-admin/admin.php?page=kashiwazaki-llmo-md&tab=general)。プラグインを最初に有効化したときに最初に表示されるデフォルトタブでもあります。
このタブの責務は次の 4 点に絞り込まれています:
- master switch (有効化チェックボックス) — 通常運用での ON/OFF
- md サブドメインのホスト名 — どのホスト名で Markdown 並行版を提供するか
- favicon プロキシ — md ホストの favicon リクエストをメインサイトの Site Icon に 302 リダイレクト
- kill switch (緊急停止ボタン) — トラブル時に一発で配信を止めるためのフェイルセーフ
設定値は WordPress の wp_options テーブルに ksmd_settings という単一 option として保存されます (KSMD_OPTION_KEY 定数)。サブキーは enabled, md_host, enable_favicon_proxy, kill_switch の 4 つです。
📌 Note
このタブの設定は md サブドメイン側のリクエスト にのみ影響します。メインサイト (www) の HTML 出力には一切手を加えません。SEO 上の canonical / hreflang / 構造化データは従来どおり従来のテーマや SEO プラグインが担当します。
画面構成
タブ内の各セクションの役割は以下のとおりです:
| セクション | UI 部品 | WordPress 内部の保存先 (ksmd_settings 内のキー) |
役割 |
|---|---|---|---|
| プラグインを有効化 | checkbox | enabled (bool) |
master switch。通常運用の ON/OFF。 |
| md サブドメインのホスト名 | text input | md_host (string) |
例: md.example.com。空欄ならサイトホストから自動算出。 |
| favicon プロキシ | checkbox | enable_favicon_proxy (bool) |
true (チェック済)。md ホストの /favicon.ico 等を Site Icon に 302 redirect。 |
| kill switch (緊急停止) | button (フォーム POST) | kill_switch (bool) |
トラブル時の即時停止フラグ。切り替え時に全キャッシュも自動 flush。 |
| 動作確認 | 外部リンク | — | md ホストの /, /robots.txt, /sitemap.xml を別タブで開きます。 |
503 が返ります。
master switch — プラグインを有効化
「プラグインを有効化」チェックボックスは、md サブドメインで Markdown を配信するか否かを切り替える 通常運用のスイッチ です。WordPress プラグイン一覧での「停止 / 有効化」とは独立しており、プラグインを有効化したまま配信だけを止めることができます。
挙動の詳細
- ON: md ホストへのリクエストはルート解決され、Markdown が配信されます。キャッシュも書き込まれます。
- OFF: md ホストへのリクエストには
503 Service Unavailableが返ります。メインサイト (www) には影響しません。SEO 上のメインサイト出力は完全に従来どおりです。
判定ロジックは includes/core-functions.php の早期リターンで行われます:
// 抜粋: includes/core-functions.php
if ( ! empty( $opts['kill_switch'] ) ) {
// kill switch ON → 503
}
if ( empty( $opts['enabled'] ) ) {
// master switch OFF → 503
}
デフォルト値
初回インストール時 (register_activation_hook の中でデフォルトを書き込む) は enabled = false です。 つまり 初期状態では md 配信は OFF で、管理画面で手動でチェックを入れる必要があります。これはセーフバイデフォルト原則に基づいた挙動で、想定外の md.example.com アクセスが 503 で安全に弾かれることを保証します。
関連 option キー
// option key: ksmd_settings (KSMD_OPTION_KEY)
$opts = get_option( 'ksmd_settings', array() );
$enabled = ! empty( $opts['enabled'] ); // bool
md サブドメインのホスト名
md.example.com に相当する ホスト名のみ をここに入力します。プロトコル (https://) は不要です — プラグイン側で home_url() から動的にスキームを取得します。
入力フォーマット
- OK:
md.example.com - OK:
md.contencial.co.jp - NG:
https://md.example.com— プロトコル不要 - NG:
md.example.com/— 末尾スラッシュ不要 - NG:
md.example.com:8080— ポート指定は非推奨 (動作未保証)
空欄の場合は ksmd_default_md_host() 関数によって自動算出されます。具体的には:
// includes/core-functions.php
function ksmd_default_md_host() {
$home_host = wp_parse_url( home_url(), PHP_URL_HOST );
if ( ! $home_host ) {
return 'md.example.com';
}
// www. を除去してから md. を付与
$host = preg_replace( '/^www\./', '', $home_host );
return 'md.' . $host;
}
例:
home_url() === 'https://www.example.com'→md.example.comhome_url() === 'https://contencial.co.jp'→md.contencial.co.jphome_url() === 'https://blog.example.com'→md.blog.example.com(注:blog.は二段階サブドメインとして残ります — 不要ならmd_host欄に明示的に入力してください)
scheme (https/http) の決定
md サブドメインに対するスキーム (https:// or http://) は md_host 欄では指定しない方針です。代わりに home_url() のスキームを継承し、それを ksmd_md_scheme filter で上書き可能にしています。
// includes/md-renderer.php (抜粋)
$scheme = wp_parse_url( home_url(), PHP_URL_SCHEME );
$scheme = (string) apply_filters( 'ksmd_md_scheme', $scheme, $url, $md_host );
通常は本番サイトが https:// なら md サブドメインも https:// になります。ローカル開発などで強制的に http にしたい場合は filter で上書きしてください。
ホスト名そのものの上書き
マルチサイトや特殊な環境でホスト名を動的に決めたい場合は ksmd_host filter を使います:
add_filter( 'ksmd_host', function( $md_host ) {
if ( is_multisite() && get_current_blog_id() === 5 ) {
return 'md.subsite.example.com';
}
return $md_host;
} );
favicon プロキシ
md サブドメインへの favicon リクエストを メインサイトの Site Icon (または home_url('/favicon.ico') フォールバック) に 302 リダイレクト する設定です。md は Markdown 配信が主目的のため HTML <head> がなく、ブラウザの favicon discovery 経路 (HTML <link rel="icon">) は使えません。本機能は「人間ブラウザで md を直接閲覧した時のタブアイコン体験」と「ブラウザの自動 favicon パス推測 (例: iOS Safari の /apple-touch-icon.png 推測)」をカバーします。
template_redirect priority -1 で捕捉 → get_site_icon_url() で取得した URL に HTTP 302 redirect (Cache-Control: public, max-age=86400) → ブラウザがメインサイトから PNG 取得。挙動の詳細
- ON (チェック済、デフォルト): 以下 5 URI への md ホストリクエストを 302 リダイレクト/動的生成:
/favicon.ico→ メイン側 Site Icon URL に 302/favicon.png→ 同上/apple-touch-icon.png→ 同上 (iOS ホーム画面追加対応)/apple-touch-icon-precomposed.png→ 同上/site.webmanifest→ 動的 JSON manifest 生成 (PWA 互換、Site Icon をicons[]に埋込み)
- OFF: md ホストの favicon リクエストはルート解決の対象になり、対応するコンテンツがなければ 404
リダイレクト先の解決
- WordPress Site Icon (推奨):
get_site_icon_url(32)が返す URL に 302。「設定 → 一般 → サイトアイコン」で設定したアイコンが使われます。 - フォールバック: Site Icon 未設定時は
home_url('/favicon.ico')に 302。テーマやサーバーの favicon があればそれが返されます。 - 両方とも 404 の場合: ブラウザは 404 を受け取りますが、md 側は「リダイレクト先の管理外」として責務を果たした扱い。
Cache-Control
302 レスポンス自体に Cache-Control: public, max-age=86400 (1 日) を付与。ブラウザは 1 日は同じリダイレクト先にアクセスし、Site Icon 変更の即時反映よりブラウザ負荷低減を優先します。
実装位置
includes/md-favicon-proxy.php で ksmd_is_favicon_request() + ksmd_redirect_favicon() + ksmd_output_webmanifest() を定義。includes/core-functions.php の template_redirect priority -1 内、既存 /robots.txt + /sitemap.xml の特殊パス分岐と同パターンで exit。
Tip: SSRF リスクなし (外部 URL を fetch せず、リダイレクトのみ)。メインサイトの uploads にしかない画像でも、ブラウザが直接そこから取得します。
備考: ブラウザがタブアイコンとして表示するかは Content-Type 依存。md ホームは Content-Type: text/markdown; charset=utf-8 で配信されるため、Chrome / Firefox 等の主要ブラウザは「ダウンロード対象」扱いし、タブを開かないことがあります。本機能は AI クローラ / curl / Safari の自動推測経路を主にカバーします。
kill switch — 緊急停止
kill switch は master switch とは独立した 緊急停止フラグ です。トラブル発生時に「いま即座に配信を止めたい」というワンタッチ操作のために存在します。
master switch との違い
| 観点 | master switch (enabled) |
kill switch (kill_switch) |
|---|---|---|
| UI | チェックボックス (フォーム保存) | 大きなボタン (即時 toggle) |
| 用途 | 通常運用の ON/OFF | トラブル発生時の即時停止 |
| キャッシュへの副作用 | なし (チェック保存のみ) | 切り替え時に全キャッシュ自動 flush |
| レスポンス | OFF → 503 | ON → 503 (master より優先) |
| 判定順 | kill_switch の後 | 最優先 (enabled より先に評価される) |
| nonce action | ksmd_save_settings |
ksmd_toggle_kill_switch |
状態遷移マトリクス
master と kill の組み合わせで md サブドメインの動作は以下のように決まります:
enabled |
kill_switch |
md ホストの応答 | 典型シーン |
|---|---|---|---|
| true | false | 200 (Markdown 配信) | 通常運用 |
| true | true | 503 | 運用中に異常検知 → kill switch ON |
| false | false | 503 | 導入直後 / 一時停止中 (テスト中) |
| false | true | 503 | 非常用 (master OFF + kill ON、二重ロック) |
⚠️ Warning
kill switch は 切り替え時に Transient / Object Cache / 専用テーブル いずれの cache backend に対しても全 flush を行います。大規模サイトでは flush 直後に re-warming 負荷が走るため、本番運用中の不要な toggle は避けてください。
kill switch の典型ユースケース
- 不正コンテンツ漏出疑い: 想定外の post_type が md 側に出てしまっているのを発見したら、対象範囲タブで除外する前に kill switch で全停止
- テーマ更新後の挙動異常: テーマアップデート後に
post_contentが崩れているのが分かったら一旦 kill - 負荷スパイク: AI クローラからの DDoS 級アクセスがあった場合、対処ができるまで一時停止
- SSL 証明書切れ: md サブドメイン側の証明書が切れて 521/525 が出ているとき
kill switch の解除手順
問題が解消したら、同じボタンを再度クリックして OFF に戻します。OFF にした瞬間も全キャッシュが flush されるため、最初のリクエストから新しい状態でレンダリングが行われます。
動作確認 (View links)
タブ最下部の「動作確認」セクションには md サブドメインの主要 URL が一覧表示されています。設定を保存した直後にここからクリックして 200 が返るかを確認してください。
https://{md_host}/— md ホスト (Markdown ホームページ)https://{md_host}/robots.txt— クローラ向けの robots.txt (User-agent ALL: Allow /)https://{md_host}/sitemap.xml— md サブドメイン専用 sitemap
これらが 200 を返さない場合は、まず DNS が md サブドメインを向いているか、次に Bootstrap installer で index.php が生成されているか を確認してください。詳細は DNS と Bootstrap を参照。
💡 Tip
ステージング環境で動作確認するときは md_host 欄に md.staging.example.com を明示入力する運用がおすすめです。www. 系のホスト名解析だけでは staging. プレフィックスが残るためです。
内部挙動 — 設定値の読まれ方
このタブで設定された値は以下のフローで読まれます:
リクエスト処理の早期判定
template_redirect hook (priority -1) で md ホストを検知した直後、以下の順序で評価されます:
$opts = get_option( 'ksmd_settings', array() )で設定を読み込みkill_switchが true → 即座に 503enabledが false → 即座に 503md_hostと現在のリクエストホストを照合 (一致しなければ通常の WordPress 処理に戻る)- md ホストへのリクエストとして md-resolver / md-renderer を起動
md_host が他で使われる場所
includes/md-resolver.php: URL の正規化 (md ↔ www の相互変換)、内部リンクを md_host に書き換える際includes/md-renderer.php: 出力中の URL がメイン側 (canonical) か md 側かの判定admin/sections/diagnostics.php: Bootstrap installer のターゲットホスト表示、verify テスト URL の組み立て
設定値の検証 (sanitization)
admin/settings-page-logic.php の ksmd_handle_save_settings() で以下が実行されます:
enabled:!empty($_POST['ksmd_enabled'])でブール化md_host:sanitize_text_field()+ 末尾スラッシュ除去 + lowercase 化kill_switch: 別 endpoint (ksmd_toggle_kill_switch) で toggle
関連 filter
このタブで設定された値を PHP コードから上書きするための filter が 2 種類用意されています。
ksmd_md_scheme
/**
* @param string $scheme 既定のスキーム (home_url から抽出された https/http)
* @param string $url 対象 URL (canonicalness の決定に使う場合あり)
* @param string $md_host ksmd_settings.md_host の値
* @return string 上書きしたいスキーム
*/
add_filter( 'ksmd_md_scheme', function( $scheme, $url, $md_host ) {
// ローカル dev 用に強制 http
if ( wp_get_environment_type() === 'local' ) {
return 'http';
}
return $scheme;
}, 10, 3 );
ksmd_host
/**
* @param string $md_host ksmd_settings.md_host の値 (空欄なら ksmd_default_md_host() の戻り値)
* @return string 最終的に使う md ホスト
*/
add_filter( 'ksmd_host', function( $md_host ) {
// マルチサイト ID 別に切り替え
if ( is_multisite() ) {
$blog_id = get_current_blog_id();
$map = array( 1 => 'md.main.example.com', 2 => 'md.sub.example.com' );
if ( isset( $map[ $blog_id ] ) ) {
return $map[ $blog_id ];
}
}
return $md_host;
} );
typical configurations
運用フェーズ別に推奨される設定パターンを示します。
パターン A — 初回導入直後 (停止状態でテスト)
enabled: false (チェック外す)md_host: 空欄 (自動算出)kill_switch: false
用途: DNS / Bootstrap installer の準備中、診断タブの Test renderer でレンダリング結果だけ確認したい段階。
パターン B — 通常運用 (本番)
enabled: truemd_host:md.example.comkill_switch: false
用途: AI クローラ (ChatGPT/Claude/Perplexity/Gemini) に向けた Markdown 配信を本番運用する標準形。
パターン C — トラブル時の緊急停止
enabled: true (本番のまま)md_host:md.example.comkill_switch: true (緊急停止)
用途: 想定外の挙動が見つかった瞬間にここを ON。原因調査・対応後に OFF へ戻すと運用再開。
パターン D — マルチサイト + custom md_host
enabled: truemd_host:md.subsite.example.com(明示)kill_switch: false- +
ksmd_hostfilter で blog_id 別の振り分けロジック
用途: WordPress マルチサイトで複数サブサイトがそれぞれ別の md.* を持つ運用。
よくある質問
Q. master switch を OFF にしたまま放置しても大丈夫?
A. 問題ありません。master switch OFF の状態は「md ホスト側のリクエストには 503 を返すが、メインサイトは完全に従来動作」を意味します。プラグインを停止 (deactivate) することと違って ksmd_settings や wp_ksmd_access_logs テーブルなどの設定は保持されたままです。再度 ON にすれば即座に運用再開できます。
Q. kill switch と master switch、どちらを使うべき?
A. 通常の運用切り替えは master switch を使ってください。kill switch は 「いま、緊急で、即座に止めたい」 場面のためのものです。kill switch の toggle は全キャッシュ flush を伴うため、頻繁に切り替えると re-warming 負荷が発生します。
Q. md_host を変更したら何が起きる?
A. 内部のリンク書き換え先が変わります。ただし 変更直後はキャッシュ内の Markdown は古い md_host を含んだまま ですので、キャッシュタブ から「全キャッシュをクリア」を実行することを推奨します。また、新しい md_host の DNS / SSL / Bootstrap installer もすべてやり直す必要があります。
Q. md_host にプロトコルやポートを書いてしまったら?
A. sanitize_text_field() と末尾スラッシュ除去は実行されますが、https:// プレフィックスやポート番号は内部 URL 結合時に二重になる可能性があります。ホスト名のみ を入力してください。
Q. md_host を空欄にした場合、どんな値が使われる?
A. ksmd_default_md_host() 関数の戻り値が使われます。これは home_url() のホスト部分から www. プレフィックスを除去して md. を頭に付けた値です (例: https://www.example.com → md.example.com)。
Q. kill switch を ON にしたまま管理画面にアクセスできる?
A. はい。kill switch は md サブドメイン側のフロントエンドリクエストにのみ作用します。メインサイトの /wp-admin/ や通常のフロントエンド (www) は影響を受けません。
Q. 動作確認の URL が 403 を返す
A. 高い確率で md ホストの DocumentRoot に index.php がない状態です。診断タブ の「md ホスト ブートストラップ」セクションで index.php を生成 を実行してください。
Q. 動作確認の URL が 503 を返す
A. master switch OFF または kill switch ON の状態です。本タブで状態を確認してください。
関連
- DNS と Bootstrap — md_host を実際に動かすために必要な DNS 設定と
index.phpブートストラップ - 診断タブ — md ホストの動作確認 / Test renderer / Bootstrap installer
- 対象範囲タブ — どの post_type / route を md 配信するかの選択 (一般タブの次に行うべき設定)
- キャッシュタブ — kill switch toggle 時に flush される対象のキャッシュバックエンド
- 拡張ポイント —
ksmd_md_scheme - 拡張ポイント —
ksmd_host - トラブルシューティング — 503 / 403 が返るときの切り分け手順