インストール・初期設定
Kashiwazaki LLMO Markdown Subdomain プラグインの導入と初期設定の完全ガイドです。事前準備、3 種類のインストール方法、有効化、最低限の設定、初期動作確認、アンインストール時の注意までを順を追って解説します。
事前準備
本プラグインは「メインサイトの HTML 出力には一切手を入れず、専用サブドメインで Markdown 並行版を配信する」という設計思想に基づいています。そのため、サーバ側でいくつかの前提条件を満たす必要があります。インストールを始める前に、以下のチェックリストを確認してください。
WordPress 環境チェック
プラグインのメインファイル kashiwazaki-llmo-md-subdomain.php のヘッダで、以下の通り宣言されています。
/**
* Plugin Name: Kashiwazaki LLMO Markdown Subdomain
* Version: 1.0.1
* Requires at least: 6.1
* Requires PHP: 7.4
* Tested up to: 6.7
* Text Domain: kashiwazaki-llmo-md-subdomain
*/
- WordPress 6.1 以降 —
is_post_publicly_viewable()ゲートを使うため必須です。 - PHP 7.4 以降 — Type hint と short arrow 関数を使用しています。8.x も動作確認済み。
- DOMDocument 拡張 — Markdown 化のための HTML パースに使用します。
- mbstring 拡張 — UA 文字列やリクエスト本文の安全な切り詰めに使います (関数が無い場合は
substrにフォールバックしますが、推奨は有効)。
💡 Tip
有効化後、診断タブの「互換性チェック」表で PHP / WP / DOMDocument / mbstring / 外部 object cache / WPML / Polylang の有無をひと目で確認できます (admin/sections/diagnostics.php)。先に最低限の前提だけ揃え、細かい確認は有効化後に診断タブで行うのが効率的です。
md サブドメイン用 DNS の準備
本プラグインの中核は「md.example.com のような専用サブドメイン」を別ドキュメントルート (もしくは Bootstrap installer で生成される index.php) で動かすことです。インストール前に以下を準備しておくと、有効化後すぐに動作確認まで通せます。
- md サブドメインの DNS A / CNAME レコード を、本サイトと同じサーバの IP に向ける
- サーバ (Nginx / Apache / コントロールパネル) で md サブドメインの VirtualHost / バーチャルドメイン定義 を作成し、ドキュメントルートを定める
- md サブドメインに対する SSL 証明書 を発行 (Let's Encrypt ワイルドカード等を推奨)
詳しい DNS / SSL / Bootstrap installer の手順は次のページ「DNS と Bootstrap installer」で解説します。本ページではプラグイン本体の導入と初期設定に集中します。
SSL 証明書 (推奨は別ドメイン分も網羅した SSL)
md サブドメインも HTTPS で配信するのが原則です。理由は次の通りです。
- HSTS の継承: メインドメインで HSTS を発行している場合、サブドメインも HTTPS でないと参照されなくなるブラウザがあります。
- AI クローラの取り扱い: ChatGPT / Claude / Perplexity / Gemini 等は基本的に
https://URL を優先します。 - Bootstrap verify が SSL を要求:
ksmd_bootstrap_verify()はhome_url()の scheme を継承します (http環境ならそのままhttp、それ以外はhttps)。
Cloudflare のような CDN を経由する場合、エッジ側で Universal SSL が自動発行されることが多いため特別な作業は不要です。直接サーバ運用の場合は Let's Encrypt のワイルドカード証明書を取得しておくと、md サブドメイン分も自動でカバーできます。
SSH / FTP / 管理画面アクセス
インストール方法は 3 種類ありますが、それぞれ必要なアクセス手段が異なります。
| 方法 | 必要なアクセス | 難易度 |
|---|---|---|
| WP 管理画面のプラグイン追加 | 管理画面ログイン | 易 |
| zip ダウンロードして手動アップロード | 管理画面 もしくは FTP/SFTP | 中 |
wp-content/plugins/ に git clone | SSH | 中 |
インストール方法
3 種類のインストール方法があります。お使いの環境に合わせて選択してください。プラグイン本体は単一ディレクトリ wp-plugin-kashiwazaki-llmo-md-subdomain-main として配布されています。
方法 1: WordPress 管理画面のプラグイン追加から
WordPress.org のプラグインディレクトリへの登録 (もしくは zip 直接アップロード) を経由するもっとも標準的な方法です。
管理画面にログインし、サイドバーの「プラグイン → 新規追加」をクリックします。
右上の検索ボックスに「Kashiwazaki LLMO Markdown Subdomain」と入力します。
該当プラグインの「今すぐインストール」をクリックします。インストールが完了したら「有効化」をクリックします。
サイドバーに「LLMO MD」のような Dashicons text-page アイコンのトップレベルメニューが表示されたら成功です (位置 81 = ツール直下相当)。
方法 2: zip ファイルをダウンロードして手動アップロード
GitHub リリースから zip を取得して管理画面にアップロードする方法です。WordPress.org 配信前のバージョンを試したい場合に有用です。
GitHub リポジトリ https://github.com/TsuyoshiKashiwazaki/wp-plugin-kashiwazaki-llmo-md-subdomain から wp-plugin-kashiwazaki-llmo-md-subdomain-main.zip をダウンロードします (または「Code → Download ZIP」)。
WordPress 管理画面 → 「プラグイン → 新規追加 → プラグインのアップロード」を開き、zip ファイルを選択します。
「今すぐインストール」を押し、続けて「有効化」を押します。
📝 Note
zip 名にバージョン番号やブランチ名 (-main 等) が付いていても問題ありません。ディレクトリ名はインストール後の動作には影響せず、内部の kashiwazaki-llmo-md-subdomain.php の Plugin Name ヘッダから一覧表示が決まります。
方法 3: wp-content/plugins/ に git clone
ステージング / 本番でバージョン管理しながら運用したいケース、もしくはプラグインに修正を加えながら開発したいケース向けです。
SSH でサーバにログインし、WordPress の wp-content/plugins/ ディレクトリに移動します。
cd /path/to/wordpress/wp-content/plugins/
リポジトリを clone します。
git clone https://github.com/TsuyoshiKashiwazaki/wp-plugin-kashiwazaki-llmo-md-subdomain.git
WordPress 管理画面 → 「プラグイン」一覧で「Kashiwazaki LLMO Markdown Subdomain」を見つけ、「有効化」をクリックします。
⚠️ Warning
git clone でディレクトリ名が wp-plugin-kashiwazaki-llmo-md-subdomain (末尾に -main なし) になる場合があります。プラグイン本体の動作はディレクトリ名に依存しません (plugin_basename(__FILE__) が自動で解決)。ただし、後述の Bootstrap installer は ABSPATH の兄弟構成 / 直下サブディレクトリ構成のみサポートしている点にご注意ください。
プラグイン有効化
有効化のステップは方法 1〜3 共通です。プラグイン一覧画面で「Kashiwazaki LLMO Markdown Subdomain」の「有効化」リンクをクリックします。有効化と同時に、register_activation_hook( __FILE__, 'ksmd_on_activate' ) によりデフォルト設定が ksmd_settings オプションに保存されます。
ksmd_add_settings_link())。有効化処理で行われること
有効化フックは副作用を最小限に保つため、以下の動作のみ行います (kashiwazaki-llmo-md-subdomain.php)。
register_activation_hook( __FILE__, 'ksmd_on_activate' );
function ksmd_on_activate() {
// 旧 option があれば先にマイグレーション
ksmd_migrate_legacy_option();
if ( false === get_option( KSMD_OPTION_KEY ) ) {
$defaults = ksmd_get_default_settings();
update_option( KSMD_OPTION_KEY, $defaults );
}
}
- 旧 option キー
kashiwazaki_llmo_md_settingsから新キーksmd_settingsへ 1 回限りのマイグレーションを行う - 新キーが未保存ならデフォルト設定を保存する (master switch は default OFF — これが事故防止のための唯一のゲート)
- 個別 post 等のデータには一切手を入れない
メニューの場所
有効化後、左サイドバーにトップレベルメニューが追加されます。メニューアイコンは dashicons-text-page、position は 81 (ツール直下相当) です (admin/admin-loader.php の ksmd_register_admin_menu())。
kashiwazaki-llmo-md) が表示される。有効化直後のデフォルト動作
有効化直後は master switch (enabled) が OFF です。md サブドメインへのリクエストは 503 を返します (これは事故防止の安全装置)。設定を確認した上で、一般タブの「プラグインを有効化」をオンにする必要があります。
📝 Note
master switch を OFF にしておけば、md サブドメインに DNS が誤って指していたとしてもメインサイトと同じ HTML が出ることはありません (503 を返すだけ)。設定が固まるまではこのまま OFF で運用しても問題ありません。
初期設定の流れ
設定画面は 7 つのタブに分かれています。それぞれの責務はおおよそ以下の通りです。最低限「一般」タブだけ正しければ、その他は default 値のまま動作します。
| タブ | option キー (例) | 役割 | 詳細 |
|---|---|---|---|
| 一般 (general) | enabled / kill_switch / md_host / enable_favicon_proxy | master switch、緊急停止、md ホスト名、favicon プロキシ (md ホストの favicon を Site Icon に 302 redirect) | settings-general.html |
| 対象範囲 (content_targets) | enabled_post_types / enabled_routes | どの post_type / route を md 化するか | settings-content-targets.html |
| 出力 (output) | enable_schema_header / enable_schema_footer / enable_md_alternate_link / home_intro_markdown | Schema header / footer / メイン側 alt-link (HTTP ヘッダ + HTML <link> タグで md 並行版告知) / md ホームの intro | settings-output.html |
| Schema.org (schema) | schema_type_map | post_type / route ごとの @type マッピング | settings-schema.html |
| キャッシュ (cache) | cache_backend / cache_duration | 3 種 backend の選択と TTL | settings-cache.html |
| 言語 (i18n) | (language overrides) | 多言語連携と inLanguage 制御 | settings-i18n.html |
| 診断 (diagnostics) | access_log_enabled / bootstrap_path | Test renderer / アクセスログ / 互換性チェック / Bootstrap installer | settings-diagnostics.html |
📝 Note
各タブの詳細は左メニューの「設定タブ」配下の各ページに集約されています。本ページでは「最低限ここだけ触れば動く」という観点に絞って解説します。
初期設定で必ず確認する 3 項目
- md_host (一般タブ) — md サブドメインのホスト名。空欄なら
ksmd_default_md_host()がhome_url()から自動算出 (例: メインがwww.example.comならmd.example.com)。 - enabled (一般タブ) — master switch。OFF だと md ホストは 503 を返します。
- kill_switch (一般タブ) — 緊急停止スイッチ。緊急時のみ ON。トグル時に全 transient を flush します。
最低限の設定 (一般タブ)
有効化後に最初に開くべきは「一般」タブです。ここで「md ホスト名」と「master switch」を確定すれば、最低限 md サブドメインが Markdown を返す状態になります。
regular-text クラスの type="text"。master switch (enabled)
「プラグインを有効化」というラベルのチェックボックスです。チェック後に「一般設定を保存」を押すと、ksmd_settings.enabled = true が保存されます。実装は以下のようになっています (admin/sections/general.php)。
<label>
<input type="checkbox" name="ksmd_enabled" value="1" <?php checked( $enabled ); ?> />
<?php esc_html_e( 'md サブドメインで Markdown を配信する', 'kashiwazaki-llmo-md-subdomain' ); ?>
</label>
OFF の場合、md ホストへのリクエストは core-functions.php の ksmd_handle_subdomain_request() 内で次のように処理され、503 を返します。
// (4) 有効/無効 (default OFF)
if ( empty( $opts['enabled'] ) ) {
ksmd_send_503( __( 'プラグインがまだ有効化されていません。設定画面で有効化してください。', 'kashiwazaki-llmo-md-subdomain' ) );
}
md ホスト名 (md_host)
md サブドメインのホスト名 (例: md.example.com) を入力します。空欄の場合は ksmd_default_md_host() が home_url() から自動算出します。
/**
* P2: home_url ベースで md.{host} のデフォルトを算出
*/
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;
}
なぜ md_host の値が重要か
md_host はプラグインの動作判定の基準です。template_redirect priority -1 で発火する ksmd_handle_subdomain_request() は、$_SERVER['HTTP_HOST'] を strtolower した値が md_host と一致した場合にだけ md レンダリングを行い、一致しなければ即 return します。つまり md_host が間違っていると、メインサイトに副作用ゼロを維持したまま、md ホストでも Markdown が出ないという状態になります。
// core-functions.php
$md_host = isset( $opts['md_host'] ) && $opts['md_host'] !== '' ? $opts['md_host'] : $default_md_host;
$md_host = apply_filters( 'ksmd_host', $md_host );
if ( $host !== strtolower( (string) $md_host ) ) {
return; // メイン側は完全に no-op
}
kill switch
緊急停止スイッチです。一般タブの下部にトグルボタンがあり、押すたびに kill_switch が反転し、同時に全 ksmd transient が削除されます。トラブル発生時 (例: 異常な負荷、誤った内容のキャッシュ配信) に「とりあえず停止して原因究明する」という用途で使います。
次のステップ: DNS と Bootstrap installer
ここまでで「プラグインの有効化」と「最低限の設定」が完了しました。続いて md サブドメインを実際にブラウザから到達可能にする作業 (DNS / SSL / md ホスト用 index.php) を行います。詳細は次のページで解説します。
- DNS と Bootstrap installer — A レコード / CNAME / Cloudflare 経由 / Let's Encrypt / Bootstrap installer の使い方
💡 Tip
md サブドメイン用に「別ドキュメントルート」を用意できない共有ホスティングや XServer 標準構成でも、Bootstrap installer を使えば管理画面から index.php を 1 クリックで配置できます。SSH/FTP は不要です。
初期動作確認
DNS と Bootstrap が完了したら、初期動作確認を行います。診断タブの 2 つの機能が便利です。
Test renderer で URL プレビュー
診断タブには「Test renderer (プレビュー)」セクションがあり、任意の URL を入力すると管理画面内でその URL の md 化結果を即時プレビューできます。実装は admin/sections/diagnostics.php および admin/admin-loader.php の ksmd_handle_test_render() です。キャッシュは bypass され、最新の Markdown が表示されます。
Test renderer は内部で ksmd_generate_test_token($uri) による HMAC-SHA256 トークンを生成し、X-Ksmd-Test-Token ヘッダ経由で md ホストに送信します。受信側は core-functions.php:112 でトークンを検証し、検証 OK なら $force_miss = true としてキャッシュを bypass します。Cookie ベースの nonce では admin → md サブドメインへの cookieless リクエストで失敗するため、wp_salt('nonce') を共有秘密にした方式に切り替えています (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 );
}
互換性チェックで警告がないか
診断タブの「互換性チェック」表で、PHP / WP / DOMDocument / mbstring / 外部 object cache / WPML / Polylang の状態を確認できます。すべて ✓ OK もしくは「未検出 / 任意」表示なら問題ありません。
具体的には admin/sections/diagnostics.php 内に以下の $checks 配列があります (抜粋)。
$checks = array(
array(
'label' => 'PHP version',
'value' => PHP_VERSION,
'ok' => version_compare( PHP_VERSION, '7.4', '>=' ),
'note' => '7.4+',
),
array(
'label' => 'WordPress version',
'value' => get_bloginfo( 'version' ),
'ok' => version_compare( get_bloginfo( 'version' ), '6.0', '>=' ),
'note' => '6.0+',
),
array(
'label' => 'DOMDocument 拡張',
'value' => class_exists( 'DOMDocument' ) ? 'OK' : 'MISSING',
'ok' => class_exists( 'DOMDocument' ),
'note' => '',
),
array(
'label' => 'mbstring 拡張',
'value' => function_exists( 'mb_convert_encoding' ) ? 'OK' : 'MISSING',
'ok' => function_exists( 'mb_convert_encoding' ),
'note' => '',
),
// ... External Object Cache / WPML / Polylang
);
md ホストへの直接アクセスでサニティチェック
ブラウザで以下の 3 つの URL を順に開きます。一般タブの「動作確認」セクションにもこのリンクがあります。
https://md.example.com/— md ホームの Markdown が出る (13-frontend-md-home.pngに近い見え方)https://md.example.com/robots.txt— text/plain で robots が返るhttps://md.example.com/sitemap.xml— application/xml で sitemap が返る
curl -I https://md.example.com/
# HTTP/1.1 200 OK
# Content-Type: text/markdown; charset=utf-8
# X-Robots-Tag: noindex, follow
# X-Ksmd-Cache: HIT (or MISS)
# Link: <https://www.example.com/>; rel="canonical"
レスポンスヘッダに以下のいずれかが含まれていれば、プラグインが正常に動作しています。
Content-Type: text/markdown; charset=utf-8— Markdown が返っている証拠X-Ksmd-Cache: HITもしくはMISS— プラグインが応答した証拠Link: <https://www.example.com/...>; rel="canonical"— メインサイトへの正規 URL を明示
アンインストール時の注意
プラグインをディアクティブ (停止) しただけでは設定や専用テーブルは残ります。完全削除すると uninstall.php が動作し、関連データを削除します。残るデータと消えるデータを把握しておきましょう。
uninstall.php で削除されるもの
uninstall.php には以下のクリーンアップ処理が定義されています。
$options_to_delete = array(
'ksmd_settings', // 現行 settings
'kashiwazaki_llmo_md_settings', // 旧 settings (migration 元)
'ksmd_access_logs', // アクセスログ (旧 option backend、互換維持)
'ksmd_cache_table_ready', // M2: cache table 作成 flag
'ksmd_access_log_table_ready', // D1: access log table 作成 flag
'ksmd_bootstrap_meta', // M2: md ホスト bootstrap メタ
'ksmd_bootstrap_last_removed_backup', // M2: 直近の bootstrap 削除バックアップ
);
foreach ( $options_to_delete as $opt ) {
delete_option( $opt );
}
// transient 削除 (ksmd_ prefix 全件)
$wpdb->query(
"DELETE FROM {$wpdb->options} WHERE option_name LIKE '\\_transient\\_ksmd\\_%' OR option_name LIKE '\\_transient\\_timeout\\_ksmd\\_%'"
);
// 専用 cache テーブルを削除
$cache_table = $wpdb->prefix . 'ksmd_cache';
if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $cache_table ) ) ) {
$wpdb->query( "DROP TABLE IF EXISTS {$cache_table}" );
}
// 専用 access_logs テーブル (D1 で導入) を削除
$access_log_table = $wpdb->prefix . 'ksmd_access_logs';
if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $access_log_table ) ) ) {
$wpdb->query( "DROP TABLE IF EXISTS {$access_log_table}" );
}
残らないもの (=プラグイン削除で消えるもの)
ksmd_settingsオプション (現行設定全体)kashiwazaki_llmo_md_settingsオプション (旧バージョンからのマイグレーション元)ksmd_access_logsオプション (旧 option バックエンドのログ)ksmd_cache_table_ready/ksmd_access_log_table_readyフラグ (テーブル作成済みマーカー)ksmd_bootstrap_meta/ksmd_bootstrap_last_removed_backup(Bootstrap installer のメタとバックアップ)- すべての
_transient_ksmd_*および_transient_timeout_ksmd_*エントリ - 専用テーブル
{prefix}ksmd_cache(custom_table キャッシュ backend 用) - 専用テーブル
{prefix}ksmd_access_logs(アクセスログ用)
残るもの (=プラグイン削除でも消えないもの)
- WordPress 本体や他プラグインのデータ (当然)
- md サブドメインの DNS / VirtualHost / SSL 証明書 (サーバ側の設定)
- md ホストに配置された
index.php(Bootstrap installer で設置したもの) —uninstall.phpでは削除しません。プラグイン削除前に診断タブの「index.php を削除」を実行することを推奨します。
⚠️ Warning
プラグインを完全削除する前に、診断タブで md ホスト用の index.php を先に削除してください。プラグイン削除後はその index.php が存在し続けますが、プラグイン本体が無くなるため md ホストへのアクセスは「require __DIR__ . "/../wp-blog-header.php";」によって メインサイトの HTML を返すようになります (DocumentRoot 仕様の都合)。これは想定外動作なので、必ず Bootstrap の uninstall を先に実行してください。
Multisite での扱い
uninstall.php は multisite に対応しています。is_multisite() が真なら get_sites() で全サイトを取得し、switch_to_blog() でループしながら各ブログ単位でクリーンアップを実行します。
if ( is_multisite() ) {
$sites = get_sites( array( 'fields' => 'ids', 'number' => 0 ) );
foreach ( $sites as $site_id ) {
switch_to_blog( $site_id );
ksmd_uninstall_cleanup_blog();
restore_current_blog();
}
} else {
ksmd_uninstall_cleanup_blog();
}
アンインストール手順 (推奨フロー)
一般タブで kill_switch を ON にして md 配信を停止し、全 transient を flush します。
診断タブで「index.php を削除」を実行し、md ホスト用 index.php を撤去します (24 時間以内なら復元可能)。
WordPress プラグイン一覧で「停止」 → 「削除」を実行します。uninstall.php が呼ばれ、option / transient / 専用テーブルがすべて消えます。
(任意) サーバ側で md サブドメインの DNS / VirtualHost / SSL を撤去します。
まとめ
本ページではインストール、有効化、最低限の設定、初期動作確認、アンインストールまでを通しで解説しました。次のページではプラグイン本体だけでは完結しない「サーバ側 (DNS / SSL / DocumentRoot / index.php)」のセットアップと、その自動化機能である Bootstrap installer を扱います。
- 事前準備: WP 6.1+ / PHP 7.4+ / DNS / SSL / SSH or FTP
- インストール: 管理画面 / zip / git clone の 3 種
- 有効化:
ksmd_on_activate()でデフォルト保存 (master switch は OFF) - 最低限の設定: 一般タブの
md_hostとenabled - 初期確認: 診断タブの Test renderer + 互換性チェック
- アンインストール: index.php 削除 → プラグイン削除の順