WordPress on DockerでWP自体をサブディレクトリにインストールし、index.phpと.htaccessを自動で移動&書き換えする
やりたいこと
昨今のWPテーマ開発ではDocker(+ Docker Compose)を利用している方も多いと思います。
大抵の場合は以下のようなdocker-compose.ymlがベースになっているのではないでしょうか。
version: "3.5"
services:
db:
image: mysql:5.7
environment:
MYSQL_USER: wordpress
MYSQL_DATABASE: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_ROOT_PASSWORD: wordpress
wp:
image: wordpress:latest
volumes:
- ./public:/var/www/html
ports:
- "3000:80"
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_TABLE_PREFIX: "wp_"
このとき、WP本体をドキュメントルート直下ではなく、以下のディレクトリ構造のように別のディレクトリにインストールしたいという需要があると思います。
(WORDPRESS Codex:WordPress_を専用ディレクトリに配置する)
.
├── wordpress
│ ├── wp-admin
│ ├── wp-content
│ ├── wp-includes
│ ├── license.txt
│ ├── readme.html
│ ├── wp-activate.php
│ ├── wp-blog-header.php
│ ├── wp-comments-post.php
│ ├── wp-config-sample.php
│ ├── wp-config.php
│ ├── wp-cron.php
│ ├── wp-links-opml.php
│ ├── wp-load.php
│ ├── wp-login.php
│ ├── wp-mail.php
│ ├── wp-settings.php
│ ├── wp-signup.php
│ ├── wp-trackback.php
│ └── xmlrpc.php
├── .htaccess
└── index.php
それっぽいワードでググってみると、やはり同じことを考える方はたくさんいらっしゃるようです。
・WordPressの公式Dockerをサブディレクトリで使う方法
・Docker WordPressをサブディレクトリで動かす
いずれもdocker-compose.ymlのworking_dirというプロパティを変えることで実現しています。
問題1 index.phpと.htaccessは手動で移動させなければならない
先に挙げた2記事の方法を使うことで、WordPress本体をサブディレクトリにインストールすることは可能ですが、index.phpと.htaccessに関しては手動で移動&書き換えをしなければいけません。
問題2 Git管理とWordPress公式イメージの特徴
WordPressのバージョン管理についてはいろいろな考え方がありますが、私は以下の.gitignoreでwp-config.phpとオリジナルのテーマファイルのみGitで管理するようにしています。
index.php
xmlrpc.php
.htaccess
license.txt
readme.html
sitemap.xml
sitemap.xml.gz
wp-admin
wp-includes
wp-*.php
!wp-config.php
**/wp-content/languages
**/wp-content/uploads
**/wp-content/upgrade
**/wp-content/plugins
**/wp-content/themes/*
!**/wp-content/themes/my-theme
この際、先ほどのindex.php&.htaccess問題を解消するために真っ先に思いつくのは、それらのファイルもGitで管理するという方法です。
ですが、WP公式イメージは「index.phpとwp-includes/version.phpが存在していない場合においてWP本体をインストールする」という仕様になっているため、index.phpをGit管理下に置いてしまうと、以降のコンテナ構築時にWP自体のインストールが実行されません。
つまり、複数人でプロジェクトを進めるときや、一度プロジェクトが完了し開発関係のファイルを削除した後に再び開く必要があった際などにおいて、開発環境の構築が上手くいかなくなってしまいます。
解決方法 index.phpと.htaccessの移動&書き換えを自動で行うようにする
前項のような問題を解決する最も簡単な方法は、index.phpと.htaccessの移動&書き換え自体がコンテナ構築時に自動で実行されるようにしておくことです。
まずはWordPress公式のdocker-entrypoint.shを一番最後の部分を以下のように書き換え、docker-compose.ymlと同じディレクトリに配置します。
...
fi
### ↓追加↓ ###
if [ -e /var/www/html/wordpress/index.php ] && [ -e /var/www/html/wordpress/.htaccess ] && [ ! -e /var/www/html/index.php ] && [ ! -e /var/www/html/.htaccess ]; then
sed -i -e 's/\/wp-blog-header\.php/\/wordpress\/wp-blog-header.php/g' /var/www/html/wordpress/index.php
mv /var/www/html/wordpress/.htaccess /var/www/html/.htaccess
mv /var/www/html/wordpress/index.php /var/www/html/index.php
fi
### ↑追加↑ ###
exec "$@"
◆解説
1行目:index.phpと.htaccessが移動元のディレクトリに存在し、かつ移動先のディレクトリに存在しないことを条件に指定する
2行目:sedコマンドで/var/www/wordpress/index.phpの内容を書き換える
3行目:/var/www/html/wordpress/.htaccessを1階層上に移動する
4行目:/var/www/html/wordpress/index.phpを1階層上に移動する
そしてdocker-compose.ymlを編集し、コンテナ側の/usr/local/bin/docker-entrypoint.shを先ほど書き換えた方のdocker-entrypoint.shに置き換えます。
volumes:
- ./public:/var/www/html
- ./docker-entrypoint.sh:/usr/local/bin/docker-entrypoint.sh
working_dir: "/var/www/html/wordpress"
ここではdocker-entrypoint.shで書き換えるディレクトリとdocker-compose.ymlのworking_dirを一致させることに注意してください。
この記事が気に入ったらサポートをしてみませんか?