概要説明
Simply Static で WordPress のページを静的 HTML に書き出し、.htaccess で HTML があるページだけ HTML を返す方法。前の書き方は検索・フォームの送信・ログイン中にも HTML を返していたので、ふつうに見るときだけに直し、作業環境の Apache で確かめました。
~ 目次 ~
- 1. 静的な HTML なら、データベースも PHP も動かずにページを返せる
- 2. Simply Static で WordPress のページを HTML にする
- 3. ドキュメントルートに HTML を置くフォルダを作る
- 4. URL は「絶対 URL」で出すように設定
- 5. 書き出し先に、作ったフォルダを指定
- 6. 変換しないページを指定
- 7. 設定ができたら HTML を作る
- 8. HTML があれば HTML を、なければ WordPress を返す
- 9. WordPress のふつうの .htaccess
- 10. その上に、静的な HTML を返すルールを足す
- 11. トップページは WordPress のまま
- 12. HTML が返っているかを確かめる
- 13. 前の書き方との違い
- 14. 確かめた結果
- 15. HTML を返すのをやめたいとき
- 16. HTML にしたあとで気をつけること
- 17. HTML の作成が途中で止まったとき
- 18. 時間がかかるサイトは、作業環境で HTML を作るのがおすすめ
- 19. 実行してもログの欄に何も出ないとき
- 20. robots.txt にも HTML のフォルダを書く
- 21. スマートフォンの実機で開いたときの速さがぜんぜん違う
静的な HTML なら、データベースも PHP も動かずにページを返せる
WordPress は、ページを開かれるたびに PHP を動かし、データベースから記事を読んで HTML を作ります。前もって HTML のファイルにしておけば、サーバーはファイルを返すだけなので、とても速くなります。
この記事では、プラグイン Simply Static でページを HTML に書き出し、HTML があるページだけは HTML を返し、ないページはいつもどおり WordPress が返すようにします。
作業環境など別の場所で HTML を作り、サーバーには HTML だけを置くのが、いちばん安全で速い使い方です。この記事のやり方は、サーバーの WordPress は動いたままで、表示だけを速くするものです。セキュリティーが強くなるわけではありません
Simply Static で WordPress のページを HTML にする
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 を置くフォルダを作る
URL は「絶対 URL」で出すように設定
書き出し先に、作ったフォルダを指定
変換しないページを指定
除外の欄には、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 を作る
作り終わったら、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
# 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 はマーカーの内側を書き直すことがあるので、マーカーの外に書きます。
# 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 が使えるサーバーのとき)。
<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)を呼びながら進みます。ほかのプラグインやセキュリティーの設定で、これらが止められていると、ログの欄に何も出ないことがあります。
<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 のフォルダを書く
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 のページをスマートフォンで開いたときの表示の速さは、びっくりするくらい速くなりました



