Simply Static で WordPress を静的 HTML にし、.htaccess で HTML があれば返す方法(ログイン中・検索・送信は WordPress へ)

広告WordPress・PHP を学べる本

Amazonのアソシエイトとして、WordPress functions.phpは適格販売により収入を得ています。

概要説明

Simply Static で WordPress のページを静的 HTML に書き出し、.htaccess で HTML があるページだけ HTML を返す方法。前の書き方は検索・フォームの送信・ログイン中にも HTML を返していたので、ふつうに見るときだけに直し、作業環境の Apache で確かめました。

WordPress は、ページを開かれるたびに PHP を動かし、データベースから記事を読んで HTML を作ります。前もって HTML のファイルにしておけば、サーバーはファイルを返すだけなので、とても速くなります。

この記事では、プラグイン Simply Static でページを HTML に書き出し、HTML があるページだけは HTML を返し、ないページはいつもどおり WordPress が返すようにします。

作業環境など別の場所で HTML を作り、サーバーには HTML だけを置くのが、いちばん安全で速い使い方です。この記事のやり方は、サーバーの WordPress は動いたままで、表示だけを速くするものです。セキュリティーが強くなるわけではありません

Simply Static で WordPress のページを HTML にする

Simply Static – WordPress プラグイン

2026 年 10 月に確かめた時点の情報です(WordPress.org のプラグインの情報より)。

項目 中身
バージョン 3.8.17(2026 年 10 月 8 日の更新)
有効なサイト 3 万以上
動く環境 WordPress 6.2 以上・PHP 7.4 以上(WordPress 7.1.3 まで確かめ済み)
無料でできること サイト全体の HTML 化・ZIP で書き出し・サーバーのフォルダ(ローカルディレクトリ)に書き出し・URL の置き換え(絶対・相対)
有料(Pro)の機能 変わったページだけの書き出し・1 ページだけの書き出し・フォームや検索の対応 など

今回は、サーバーの上に HTML を作り、開かれたページの HTML があればそれを返す、という使い方です。流れは次のとおりです。

順番 すること
1 ドキュメントルートに、HTML を置くフォルダ(public_static)を作る
2 Simply Static で、そのフォルダに HTML を書き出す
3 .htaccess に、HTML があれば HTML を返すルールを足す

下の設定の画面は 2024 年のものです。今のバージョンでは、項目の場所や名前が少し違うことがあります。

ドキュメントルートに HTML を置くフォルダを作る

Simply Static で WordPress を静的 HTML にし、.htaccess で HTML があれば返す方法(ログイン中・検索・送信は WordPress へ)

URL は「絶対 URL」で出すように設定

Simply Static で WordPress を静的 HTML にし、.htaccess で HTML があれば返す方法(ログイン中・検索・送信は WordPress へ)

書き出し先に、作ったフォルダを指定

Simply Static で WordPress を静的 HTML にし、.htaccess で HTML があれば返す方法(ログイン中・検索・送信は WordPress へ)

変換しないページを指定

Simply Static で WordPress を静的 HTML にし、.htaccess で HTML があれば返す方法(ログイン中・検索・送信は WordPress へ)

除外の欄には、HTML にしたくない URL を 1 行に 1 つ書きます。私は次のように書きました。

書いたもの 外した理由
wp-json・wp-login.php REST API とログインの画面。HTML にする意味がない
wp-content・wp-includes 画像や CSS はもともとファイルなので、コピーしなくてよい
sitemap サイトマップは WordPress が毎回作るものを使う
contact お問い合わせのフォームは PHP で動かしたい
archives お試しで一部だけ変換したときに入れた。このサイトは記事の URL が /archives/番号 なので、入れたままだと記事が 1 つも HTML にならない

PHP で動かしたいページを外したり、まずはお試しで一部のページだけ変換したりしたいときに、上の設定をします

設定ができたら HTML を作る

Simply Static で WordPress を静的 HTML にし、.htaccess で HTML があれば返す方法(ログイン中・検索・送信は WordPress へ)

作り終わったら、FTP やファイルマネージャーで public_static の中を見ると、ページごとのフォルダと index.html ができています(例:/archives/817 なら public_static/archives/817/index.html)。

下の .htaccess を入れたあとは、https://(サイトのドメイン)/public_static/… を直接開くと、元の URL に移るようにしてあります。

HTML があれば HTML を、なければ WordPress を返す

HTML だけでサイトを出すには、URL を変えたり、Apache や nginx のドキュメントルートを変えたりする必要があります。今回は、作ったフォルダに対応する HTML があるページだけ、URL はそのままで中身を HTML に差し替えます。ブラウザから見た URL は変わりません(リダイレクトではなく、サーバーの中での書き換えです)

.htaccess で「HTML のファイルがあれば HTML を返す。なければ WordPress に回す」ようにします。

WordPress のふつうの .htaccess

.htaccess(WordPress が書くもの)
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

その上に、静的な HTML を返すルールを足す

ドキュメントルートの public_static に HTML を書き出した場合の書き方です。WordPress の「# BEGIN WordPress」の上に書きます。WordPress はマーカーの内側を書き直すことがあるので、マーカーの外に書きます。

.htaccess
# BEGIN static-html(WordPress のルールより上に書く)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# public_static/ を直接開いたときは、元の URL へ移す(同じページが 2 つできないように)
RewriteCond %{THE_REQUEST} \s/public_static/
RewriteRule ^public_static/(.*?)/?(?:index\.html)?$ /$1 [R=301,L]

# 静的な HTML があり、次の条件をすべて満たすときだけ、その HTML を返す
RewriteCond %{REQUEST_METHOD} ^(GET|HEAD)$
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP_COOKIE} !(wordpress_logged_in_|comment_author_|wp-postpass_) [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/public_static/$1/index.html -f
RewriteRule ^(.+?)/?$ /public_static/$1/index.html [L]
</IfModule>
# END static-html

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
書き方 役目
THE_REQUEST と R=301 /public_static/… を直接開かれたら、元の URL へ移す。同じページが 2 つの URL で見られないようにする
REQUEST_METHOD ^(GET|HEAD)$ ふつうに見るときだけ HTML を返す。フォームの送信(POST)は WordPress へ
QUERY_STRING ^$ ? が付いた URL(検索・プレビュー・?utm_… など)は WordPress へ
HTTP_COOKIE ログイン中の人・コメントを書いた人・パスワード付きの記事を開いた人は WordPress へ
REQUEST_FILENAME !-f 画像や CSS など、本物のファイルはそのまま返す
%{DOCUMENT_ROOT}/public_static/$1/index.html -f そのページの HTML があるときだけ書き換える。$1 は URL のパス(最後の / は付いていてもいなくてもよい)
RewriteRule ^(.+?)/?$ 1 文字以上のパスだけが対象。トップページ(/)は対象にしない

HTML を返したかどうかを外から分かるように、public_static の中にも小さな .htaccess を置きます(mod_headers が使えるサーバーのとき)。

public_static/.htaccess
<IfModule mod_headers.c>
Header set X-Static-Html "HIT"
</IfModule>

HTML を返したときだけ、応答のヘッダーに「X-Static-Html: HIT」が付きます。このフォルダで noindex のヘッダーを付けると、書き換えたページ全部に付いてしまうので、付けないでください。

トップページは WordPress のまま

トップページでは、検索やランダム表示など、PHP の機能がいくつも動いていることが多いので、今回は HTML にする対象から外しています

HTML が返っているかを確かめる

ヘッダーを見るのがいちばん確実です。

コマンドで確かめる
curl -I https://(サイトのドメイン)/archives/817

「X-Static-Html: HIT」があれば HTML が返っています。ブラウザなら、開発者ツールのネットワークのタブで同じヘッダーを見られます。

前の書き方では、ログイン中でも HTML が返るので「管理バーが出なければ HTML」と判断していました。新しい書き方では、ログイン中はいつも WordPress が返します(管理バーが出る)。ログインしていない窓(シークレットウィンドウ)で確かめてください。

前の書き方との違い

開き方 前の書き方 新しい書き方
ふつうに開く HTML HTML
? が付いた URL(検索など) HTML(? が効かない) WordPress
フォームの送信(POST) HTML(送った中身が WordPress に届かない) WordPress
ログイン中 HTML(直したあとも古いページが見える) WordPress
/public_static/… を直接開く 同じページが見える(URL が 2 つになる) 元の URL へ移る(301)

確かめた結果

このサイトの作業環境(XAMPP の Apache 2.4・WordPress 7.1.3・PHP 8.3)に試しのフォルダを作り、前と新しい .htaccess を並べて確かめました(確かめたあとフォルダは消しました。サイトの本物の .htaccess は変えていません)。

試したこと 前の書き方 新しい書き方
/archives/817 HTML(200) HTML(200・HIT)
/archives/817/(最後に /) HTML(200) HTML(200・HIT)
/archives/817?s=test HTML WordPress
POST で送る HTML WordPress
ログインの Cookie つき HTML WordPress
HTML がないページ WordPress WordPress
トップページ WordPress WordPress
/public_static/archives/817/ を直接 HTML(200) 301 で /archives/817 へ
本物のファイル そのまま そのまま
HEAD(curl -I) HTML HTML(HIT)

public_static/ 内の HTML を直接書き換えて FTP で上げ、その変更が表示されるかを見ても、HTML が返っていることを確かめられます。

HTML を返すのをやめたいとき

.htaccess に足したルール(BEGIN static-html から END static-html まで)を消すか、public_static のフォルダの名前を変える・消すと、すぐに WordPress の表示に戻ります

HTML にしたあとで気をつけること

こんなとき すること
記事を直した・追加した HTML は自動では変わらない。Simply Static でもう一度書き出すか、そのページの public_static のフォルダを消す(消せば WordPress が返す)。無料版は全体の書き出しだけで、変わったページだけの書き出しは Pro の機能
ランダム表示・新着の表示 HTML を作ったときの中身のまま止まる。PHP ではなく JavaScript で出すように変えると、HTML でも動く
フォーム・コメント 送信は WordPress に届くが、フォームの画面が古い HTML だと、中に入っている確認用の値(nonce)が古くなり、送信で断られることがある。フォームのページは除外に入れる

HTML の作成が途中で止まったとき

書き出しに時間がかかると、途中で止まることがあります。

私の環境では、画面をリロードすると、続きから処理が進みました。

時間がかかるサイトは、作業環境で HTML を作るのがおすすめ

書き出しのあいだ、サーバーに長く負荷がかかります。ページの多いサイトは作業環境で HTML を作り、作った HTML をサーバーに上げるようにしましょう

実行してもログの欄に何も出ないとき

Simply Static は、管理画面から WordPress の中の処理(admin-ajax.php や REST API)を呼びながら進みます。ほかのプラグインやセキュリティーの設定で、これらが止められていると、ログの欄に何も出ないことがあります。

wp-admin/.htaccess(Apache 2.4 の書き方)
<Files "admin-ajax.php">
  Require all granted
</Files>
<Files "admin-post.php">
  Require all granted
</Files>

wp-admin/.htaccess で管理画面に IP などの制限をかけている場合に、上の内容を足して、動きが変わるかを確かめます。前の記事の「allow from all」は Apache 2.2 の古い書き方なので、2.4 では Require all granted を使います。

上の対応で変わらないときは、設定を元に戻しておきましょう。

robots.txt にも HTML のフォルダを書く

robots.txt
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php
Disallow: /public_static/

Sitemap: https://functions.fs-create.net/sitemap.xml

上の .htaccess で /public_static/ は元の URL へ移るようにしてありますが、念のため検索エンジンにも見に来ないよう伝えておきます。

スマートフォンの実機で開いたときの速さがぜんぜん違う

PHP の処理もデータベースへの接続もない、静的な HTML のページをスマートフォンで開いたときの表示の速さは、びっくりするくらい速くなりました

関連機能

  1. WordPress ウィジェットにサムネイル付き記事を表示 Recent Posts Widget Extended

  2. WP Mail SMTP プラグインのDMARC警告対応について ( エックスサーバー )

  3. WordPress ダウンロード販売機能を Stripe + WP Simple Pay プラグインで実装する方法

サイドバー

よく使うカスタマイズ

最近の記事

  1. Fstyle Final Output Replacer のルールの一覧(generator タグを消す 2 つのルール)

Profile

PAGE TOP