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

それっぽいワードでググってみると、やはり同じことを考える方はたくさんいらっしゃるようです。

画像3

・WordPressの公式Dockerをサブディレクトリで使う方法
・Docker WordPressをサブディレクトリで動かす

いずれもdocker-compose.ymlworking_dirというプロパティを変えることで実現しています。

問題1 index.phpと.htaccessは手動で移動させなければならない

先に挙げた2記事の方法を使うことで、WordPress本体をサブディレクトリにインストールすることは可能ですが、index.php.htaccessに関しては手動で移動&書き換えをしなければいけません。

画像1

画像2

問題2 Git管理とWordPress公式イメージの特徴

WordPressのバージョン管理についてはいろいろな考え方がありますが、私は以下の.gitignorewp-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.ymlworking_dirを一致させることに注意してください。

今回使ったサンプルのリポジトリはこちらです。

この記事が気に入ったらサポートをしてみませんか?