はじめに
先日、静的生成サイトを構築するプラグインを出しました。その補完として、そのプラグインを利用したサイト構築のためのシェルスクリプトを掲載します。このプラグインは、WP-CLI でのみ動作します。
このブログは、このプラグインとシェルスクリプトで静的サイトになっており、WordPress の本体、データベースは取り除かれていて、この記事もテスト環境側の WordPress で書かれています。静的サイトだと、ブログのコメントが出来なくなりますが、ブログのコメントは、SNS 上で記事をシェアした際に、SNS 上で付くコメントの方が多いので、必要を感じません。また、コンタクトフォームは自前のものを、php で用意し、記事中に、iframe
タグで埋め込みました。
要件
- ローカル開発者環境で、WP-CLI がインストールされており、コマンドプロンプトでシェルスクリプト(#!/bin/sh)が使える事。
- ローカル開発者環境と、リモートステージング環境が、SSH で繋がっている事(rsync コマンド利用の為)。
- パーマリンクの URL の設定が、トレイリングスラッシュである事。このプラグインは、URL の末尾にパラメータが付いていたり、トレイリングスラッシュが無いと動作を辞め生成しません。
- このプラグインはトレイリングスラッシュ以下に、ファイルを生成します。そのファイルを以下に記します。
index.html
– html のファイルです。index.xml
– フィードのファイルです。.htaccess
–index.xml
と同じ場所に生成します。index.xml
を認識させるために、DirectoryIndex index.xml
とだけ書いてあります。Apache2 サーバーのみ使用可能なので、nginx などの他のサーバーの場合は、index.xml
が認識するように対処してください。
- リダイレクトがある場合には、生成しません。ただし、そのディレクトリは作成します。
※2 はあると便利ですが、ない場合には、FTP でのアップロードで代替えできます。
コード
#!/bin/sh
# 引数の確認
if [ $# -lt 1 ]; then
echo "使い方: $0 [test|stage]"
exit 1
fi
# 引数で環境を受け取る
env="$1"
# test WordPress サイト名
wp_site_name="blog.riverforest-wp.info"
# stage サイトディレクトリ名
stage_site_dir="dodesyo:~/public_html/blog.riverforest-wp.info/"
# 環境に応じた静的サイト名と出力ディレクトリを設定
case "$env" in
test)
static_site_name="static.riverforest.test"
abs_path="/home/katsushi/www/$static_site_name"
;;
stage)
static_site_name="blog.riverforest-wp.info"
abs_path="/home/katsushi/static-temp/$static_site_name"
;;
*)
echo "不正な環境指定です。test、または stage を指定してください。"
exit 1
;;
esac
# 静的サイト名のディレクトリを存在確認し、無ければ作成
if [ ! -d "$abs_path" ]; then
mkdir "$abs_path"
echo "ディレクトリが無いので作成しました: $abs_path"
fi
# Static Site Generator による生成
wp static "$abs_path" https://$static_site_name --cb1="$wp_site_name" --ca1="$static_site_name"
# Static Site Generator による image & video sitemap のみの生成
wp static "$abs_path" https://$static_site_name --cb1="$wp_site_name" --ca1="$static_site_name" --s --file1="feed/googleimagesitemap/index.xml" --orgurl1="https://$wp_site_name/feed/googleimagesitemap" --file2="feed/googlevideossitemap/index.xml" --orgurl2="https://$wp_site_name/feed/googlevideossitemap"
# 必要ファイル類のコピー wp-includes 関連
cp -f wp-includes/js/wp-emoji-release.min.js "$abs_path"/wp-includes/js
if [ ! -d "$abs_path"/wp-includes/images ]; then
mkdir "$abs_path"/wp-includes/images
fi
cp -rf wp-includes/images/media "$abs_path"/wp-includes/images
# 必要ファイル類のコピー インストールプラグイン関連
cp -rf wp-content/plugins/cookie-law-info/lite/frontend/images "$abs_path"/wp-content/plugins/cookie-law-info/lite/frontend/images
cp -rf wp-content/plugins/riverforest-function/icomoon/fonts "$abs_path"/wp-content/plugins/riverforest-function/icomoon/fonts
if [ ! -d "$abs_path"/wp-content/plugins/media-sitemap ]; then
mkdir "$abs_path"/wp-content/plugins/media-sitemap
fi
cp -rf wp-content/plugins/media-sitemap/xsl "$abs_path"/wp-content/plugins/media-sitemap/xsl
# 必要ファイル類のコピー カスタム php スクリプト(コンタクトフォーム)関連
cp -rf custom "$abs_path"
# xmlrpc.php の削除
rm -f xmlrpc.php
if [ "$env" = "stage" ]; then
echo "ホスト側と rsync で同期を開始します"
rsync -avz -e ssh "$abs_path"/ "$stage_site_dir"
echo "ホスト側と rsync で同期を終了しました"
# ローカルホストの静的ファイルをディレクトリごと全て削除
rm -rf $abs_path
fi
exit
使い方&解説
シェルスクリプト名が、static.sh
だとして、引数を指定します。引数は test
か、stage
のどちらかです。
- 引数
test
:ローカル環境にファイルを作成 - 引数
stage
:ローカル環境に一時的にファイルを作成し、リモートステージング環境にファイルをコピー。
動作

解説
- 13行:テスト環境の WordPress のサイト名。
- 16行:ステージング環境の WordPress のディレクトリ名、正確には、
.ssh
の、config
ファイルに書いた、host 名(dodesyo:
)とディレクトリ名(~/public_html/blog.riverforest-wp.info/
)になります。 - 21行ー22行:テスト環境のサイト名と、サイトディレクトリ名。
- 25行ー26行:ステージング環境のサイト名と、サイトディレクトリ名。
- 41行:プラグインのコマンド。
--cb1
オプションは、変更する前(テスト環境)のサイト名、--ca1
オプションは、変更後(静的サイト)のサイト名。 - 44行:プラグインのコマンド。
--s
オプションは、--file
--orgurl
オプションの作業だけ行うの意味。Media Sitemap for Google というプラグインの生成するサイトマップを生成するためのもの。 - 47行ー51行:WordPress の本体のファイルが必要な場合にコピー。
- 54行:CookieYes というプラグインで必要なものをコピー。
- 55行:このサイトで必要な処理を自身でプラグイン化したもので必要なものをコピー。
- 56行ー59行:Media Sitemap for Google というプラグインで必要なものをコピー。
- 62行:自身で php で作成した、コンタクトフォーム一式をコピー。
- 65行:プラグインが、
xmlrpc.php
をコピーしてきてしまうので、削除。 - 67行以降:rsync で、ステージング環境に出力するためのもの。FTP 等でコピーするなら不要。
この方法で静的化したサイト
以下に、この方法で静的化したこのサイト以外の自分のサイトを示します。
終わりに
静的サイトにしてみて、表示が早くなったのを実感します。また、セキュリティ的な圧力から解放されます。