プラグインとシェルスクリプトで静的生成サイトの構築

はじめに

先日、静的生成サイトを構築するプラグインを出しました。その補完として、そのプラグインを利用したサイト構築のためのシェルスクリプトを掲載します。このプラグインは、WP-CLI でのみ動作します。

Static Site Generator のアイコン
静的サイトを生成します。
(0) 最終更新: 2か月 前
629ダウンロード 検証済み: 6.8.1
ダウンロード: リリース: 2025-03-23
2025-07-11 06:35 時点の統計

このブログは、このプラグインとシェルスクリプトで静的サイトになっており、WordPress の本体、データベースは取り除かれていて、この記事もテスト環境側の WordPress で書かれています。静的サイトだと、ブログのコメントが出来なくなりますが、ブログのコメントは、SNS 上で記事をシェアした際に、SNS 上で付くコメントの方が多いので、必要を感じません。また、コンタクトフォームは自前のものを、php で用意し、記事中に、iframe タグで埋め込みました。

要件

  1. ローカル開発者環境で、WP-CLI がインストールされており、コマンドプロンプトでシェルスクリプト(#!/bin/sh)が使える事。
  2. ローカル開発者環境と、リモートステージング環境が、SSH で繋がっている事(rsync コマンド利用の為)。
  3. パーマリンクの URL の設定が、トレイリングスラッシュである事。このプラグインは、URL の末尾にパラメータが付いていたり、トレイリングスラッシュが無いと動作を辞め生成しません。
  4. このプラグインはトレイリングスラッシュ以下に、ファイルを生成します。そのファイルを以下に記します。
    • index.html – html のファイルです。
    • index.xml – フィードのファイルです。
    • .htaccessindex.xml と同じ場所に生成します。index.xml を認識させるために、DirectoryIndex index.xml とだけ書いてあります。Apache2 サーバーのみ使用可能なので、nginx などの他のサーバーの場合は、index.xml が認識するように対処してください。
  5. リダイレクトがある場合には、生成しません。ただし、そのディレクトリは作成します。

※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 等でコピーするなら不要。

この方法で静的化したサイト

以下に、この方法で静的化したこのサイト以外の自分のサイトを示します。

終わりに

静的サイトにしてみて、表示が早くなったのを実感します。また、セキュリティ的な圧力から解放されます。