一般タブ — 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 点に絞り込まれています:

  1. master switch (有効化チェックボックス) — 通常運用での ON/OFF
  2. md サブドメインのホスト名 — どのホスト名で Markdown 並行版を提供するか
  3. favicon プロキシ — md ホストの favicon リクエストをメインサイトの Site Icon に 302 リダイレクト
  4. 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 プラグインが担当します。

画面構成

一般タブの全景
図: 一般タブの全景 — 上から順に master switch、md ホスト名入力、kill switch ボタン、動作確認リンクの 4 ブロックで構成されています。

タブ内の各セクションの役割は以下のとおりです:

セクション 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 を別タブで開きます。
master switch と md ホスト名の拡大
図: master switch と md ホスト名入力欄の拡大。チェックボックスをオフにすると md サブドメイン側のリクエストには 503 が返ります。
一般タブの概念図
図: 一般タブの概念図 — master switch と kill switch がそれぞれ独立した状態フラグとして、md ホストへのリクエストルーティングを制御します。

master switch — プラグインを有効化

「プラグインを有効化」チェックボックスは、md サブドメインで Markdown を配信するか否かを切り替える 通常運用のスイッチ です。WordPress プラグイン一覧での「停止 / 有効化」とは独立しており、プラグインを有効化したまま配信だけを止めることができます。

挙動の詳細

判定ロジックは 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() から動的にスキームを取得します。

入力フォーマット

空欄の場合は 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;
}

例:

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 推測)」をカバーします。

md ホスト favicon プロキシの流れ
図: favicon プロキシの流れ — ブラウザが md ホストの 5 URI に GET → プラグインが template_redirect priority -1 で捕捉 → get_site_icon_url() で取得した URL に HTTP 302 redirect (Cache-Control: public, max-age=86400) → ブラウザがメインサイトから PNG 取得。

挙動の詳細

リダイレクト先の解決

  1. WordPress Site Icon (推奨): get_site_icon_url(32) が返す URL に 302。「設定 → 一般 → サイトアイコン」で設定したアイコンが使われます。
  2. フォールバック: Site Icon 未設定時は home_url('/favicon.ico') に 302。テーマやサーバーの favicon があればそれが返されます。
  3. 両方とも 404 の場合: ブラウザは 404 を受け取りますが、md 側は「リダイレクト先の管理外」として責務を果たした扱い。

Cache-Control

302 レスポンス自体に Cache-Control: public, max-age=86400 (1 日) を付与。ブラウザは 1 日は同じリダイレクト先にアクセスし、Site Icon 変更の即時反映よりブラウザ負荷低減を優先します。

実装位置

includes/md-favicon-proxy.phpksmd_is_favicon_request() + ksmd_redirect_favicon() + ksmd_output_webmanifest() を定義。includes/core-functions.phptemplate_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 の典型ユースケース

  1. 不正コンテンツ漏出疑い: 想定外の post_type が md 側に出てしまっているのを発見したら、対象範囲タブで除外する前に kill switch で全停止
  2. テーマ更新後の挙動異常: テーマアップデート後に post_content が崩れているのが分かったら一旦 kill
  3. 負荷スパイク: AI クローラからの DDoS 級アクセスがあった場合、対処ができるまで一時停止
  4. SSL 証明書切れ: md サブドメイン側の証明書が切れて 521/525 が出ているとき

kill switch の解除手順

問題が解消したら、同じボタンを再度クリックして OFF に戻します。OFF にした瞬間も全キャッシュが flush されるため、最初のリクエストから新しい状態でレンダリングが行われます。

動作確認 (View links)

タブ最下部の「動作確認」セクションには md サブドメインの主要 URL が一覧表示されています。設定を保存した直後にここからクリックして 200 が返るかを確認してください。

これらが 200 を返さない場合は、まず DNS が md サブドメインを向いているか、次に Bootstrap installer で index.php が生成されているか を確認してください。詳細は DNS と Bootstrap を参照。

💡 Tip

ステージング環境で動作確認するときは md_host 欄に md.staging.example.com を明示入力する運用がおすすめです。www. 系のホスト名解析だけでは staging. プレフィックスが残るためです。

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

このタブで設定された値は以下のフローで読まれます:

リクエスト処理の早期判定

template_redirect hook (priority -1) で md ホストを検知した直後、以下の順序で評価されます:

  1. $opts = get_option( 'ksmd_settings', array() ) で設定を読み込み
  2. kill_switch が true → 即座に 503
  3. enabled が false → 即座に 503
  4. md_host と現在のリクエストホストを照合 (一致しなければ通常の WordPress 処理に戻る)
  5. md ホストへのリクエストとして md-resolver / md-renderer を起動

md_host が他で使われる場所

設定値の検証 (sanitization)

admin/settings-page-logic.phpksmd_handle_save_settings() で以下が実行されます:

関連 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 — 初回導入直後 (停止状態でテスト)

用途: DNS / Bootstrap installer の準備中、診断タブの Test renderer でレンダリング結果だけ確認したい段階。

パターン B — 通常運用 (本番)

用途: AI クローラ (ChatGPT/Claude/Perplexity/Gemini) に向けた Markdown 配信を本番運用する標準形。

パターン C — トラブル時の緊急停止

用途: 想定外の挙動が見つかった瞬間にここを ON。原因調査・対応後に OFF へ戻すと運用再開。

パターン D — マルチサイト + custom md_host

用途: WordPress マルチサイトで複数サブサイトがそれぞれ別の md.* を持つ運用。

よくある質問

Q. master switch を OFF にしたまま放置しても大丈夫?

A. 問題ありません。master switch OFF の状態は「md ホスト側のリクエストには 503 を返すが、メインサイトは完全に従来動作」を意味します。プラグインを停止 (deactivate) することと違って ksmd_settingswp_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.commd.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 の状態です。本タブで状態を確認してください。

関連