インストール・初期設定

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
 */

💡 Tip

有効化後、診断タブの「互換性チェック」表で PHP / WP / DOMDocument / mbstring / 外部 object cache / WPML / Polylang の有無をひと目で確認できます (admin/sections/diagnostics.php)。先に最低限の前提だけ揃え、細かい確認は有効化後に診断タブで行うのが効率的です。

md サブドメイン用 DNS の準備

本プラグインの中核は「md.example.com のような専用サブドメイン」を別ドキュメントルート (もしくは Bootstrap installer で生成される index.php) で動かすことです。インストール前に以下を準備しておくと、有効化後すぐに動作確認まで通せます。

詳しい DNS / SSL / Bootstrap installer の手順は次のページ「DNS と Bootstrap installer」で解説します。本ページではプラグイン本体の導入と初期設定に集中します。

SSL 証明書 (推奨は別ドメイン分も網羅した SSL)

md サブドメインも HTTPS で配信するのが原則です。理由は次の通りです。

Cloudflare のような CDN を経由する場合、エッジ側で Universal SSL が自動発行されることが多いため特別な作業は不要です。直接サーバ運用の場合は Let's Encrypt のワイルドカード証明書を取得しておくと、md サブドメイン分も自動でカバーできます。

SSH / FTP / 管理画面アクセス

インストール方法は 3 種類ありますが、それぞれ必要なアクセス手段が異なります。

方法必要なアクセス難易度
WP 管理画面のプラグイン追加管理画面ログイン
zip ダウンロードして手動アップロード管理画面 もしくは FTP/SFTP
wp-content/plugins/git cloneSSH

インストール方法

3 種類のインストール方法があります。お使いの環境に合わせて選択してください。プラグイン本体は単一ディレクトリ wp-plugin-kashiwazaki-llmo-md-subdomain-main として配布されています。

方法 1: WordPress 管理画面のプラグイン追加から

WordPress.org のプラグインディレクトリへの登録 (もしくは zip 直接アップロード) を経由するもっとも標準的な方法です。

1

管理画面にログインし、サイドバーの「プラグイン → 新規追加」をクリックします。

2

右上の検索ボックスに「Kashiwazaki LLMO Markdown Subdomain」と入力します。

3

該当プラグインの「今すぐインストール」をクリックします。インストールが完了したら「有効化」をクリックします。

4

サイドバーに「LLMO MD」のような Dashicons text-page アイコンのトップレベルメニューが表示されたら成功です (位置 81 = ツール直下相当)。

方法 2: zip ファイルをダウンロードして手動アップロード

GitHub リリースから zip を取得して管理画面にアップロードする方法です。WordPress.org 配信前のバージョンを試したい場合に有用です。

1

GitHub リポジトリ https://github.com/TsuyoshiKashiwazaki/wp-plugin-kashiwazaki-llmo-md-subdomain から wp-plugin-kashiwazaki-llmo-md-subdomain-main.zip をダウンロードします (または「Code → Download ZIP」)。

2

WordPress 管理画面 → 「プラグイン → 新規追加 → プラグインのアップロード」を開き、zip ファイルを選択します。

3

「今すぐインストール」を押し、続けて「有効化」を押します。

📝 Note

zip 名にバージョン番号やブランチ名 (-main 等) が付いていても問題ありません。ディレクトリ名はインストール後の動作には影響せず、内部の kashiwazaki-llmo-md-subdomain.phpPlugin Name ヘッダから一覧表示が決まります。

方法 3: wp-content/plugins/git clone

ステージング / 本番でバージョン管理しながら運用したいケース、もしくはプラグインに修正を加えながら開発したいケース向けです。

1

SSH でサーバにログインし、WordPress の wp-content/plugins/ ディレクトリに移動します。

cd /path/to/wordpress/wp-content/plugins/
2

リポジトリを clone します。

git clone https://github.com/TsuyoshiKashiwazaki/wp-plugin-kashiwazaki-llmo-md-subdomain.git
3

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 );
    }
}

メニューの場所

有効化後、左サイドバーにトップレベルメニューが追加されます。メニューアイコンは dashicons-text-page、position は 81 (ツール直下相当) です (admin/admin-loader.phpksmd_register_admin_menu())。

管理メニュー上のプラグイン位置
管理画面メニューに「LLMO MD」(plugin slug: 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_proxymaster 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_markdownSchema header / footer / メイン側 alt-link (HTTP ヘッダ + HTML <link> タグで md 並行版告知) / md ホームの introsettings-output.html
Schema.org (schema)schema_type_mappost_type / route ごとの @type マッピングsettings-schema.html
キャッシュ (cache)cache_backend / cache_duration3 種 backend の選択と TTLsettings-cache.html
言語 (i18n)(language overrides)多言語連携と inLanguage 制御settings-i18n.html
診断 (diagnostics)access_log_enabled / bootstrap_pathTest renderer / アクセスログ / 互換性チェック / Bootstrap installersettings-diagnostics.html

📝 Note

各タブの詳細は左メニューの「設定タブ」配下の各ページに集約されています。本ページでは「最低限ここだけ触れば動く」という観点に絞って解説します。

初期設定で必ず確認する 3 項目

最低限の設定 (一般タブ)

有効化後に最初に開くべきは「一般」タブです。ここで「md ホスト名」と「master switch」を確定すれば、最低限 md サブドメインが Markdown を返す状態になります。

一般タブの master switch と md_host 入力欄
一般タブ: master switch と md ホスト名入力。input は 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.phpksmd_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) を行います。詳細は次のページで解説します。

💡 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.phpksmd_handle_test_render() です。キャッシュは bypass され、最新の Markdown が表示されます。

診断タブの Test renderer
Test renderer: 任意 URL を入力して md 化結果をプレビュー (キャッシュは bypass)。

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 もしくは「未検出 / 任意」表示なら問題ありません。

診断タブの互換性チェック
互換性チェック: PHP 7.4+ / WP 6.0+ / DOMDocument / mbstring を判定。

具体的には 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 を順に開きます。一般タブの「動作確認」セクションにもこのリンクがあります。

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"

レスポンスヘッダに以下のいずれかが含まれていれば、プラグインが正常に動作しています。

アンインストール時の注意

プラグインをディアクティブ (停止) しただけでは設定や専用テーブルは残ります。完全削除すると 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}" );
}

残らないもの (=プラグイン削除で消えるもの)

残るもの (=プラグイン削除でも消えないもの)

⚠️ 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();
}

アンインストール手順 (推奨フロー)

1

一般タブで kill_switch を ON にして md 配信を停止し、全 transient を flush します。

2

診断タブで「index.php を削除」を実行し、md ホスト用 index.php を撤去します (24 時間以内なら復元可能)。

3

WordPress プラグイン一覧で「停止」 → 「削除」を実行します。uninstall.php が呼ばれ、option / transient / 専用テーブルがすべて消えます。

4

(任意) サーバ側で md サブドメインの DNS / VirtualHost / SSL を撤去します。

まとめ

本ページではインストール、有効化、最低限の設定、初期動作確認、アンインストールまでを通しで解説しました。次のページではプラグイン本体だけでは完結しない「サーバ側 (DNS / SSL / DocumentRoot / index.php)」のセットアップと、その自動化機能である Bootstrap installer を扱います。