WordPress コンテナに Cocoon テーマをアップロードする方法

はじめに

WordPress に Cocoon をインストールする際、WordPress をホストしているサーバの設定が初期状態のままだとアップロードに失敗するケースがあります。 本記事は起きるエラーと原因、その対処法を説明します。

起きるエラー

XServer レンタルサーバー では初期状態でも発生しません。WordPress コンテナを使った場合にのみ発生します。Cocoon テーマのアップロード時に発生するエラーは以下の画面のものです。

alt text

「辿ったリンクは期限が切れています。」という文言なので WordPress の構築や設定に問題があるように感じますが、実際はそうではありません。

原因

ini ファイルという設定ファイルに定義された upload_max_filesizepost_max_size の値が小さいことです。 Cocoon 親テーマは約 22 MB ですが、上記の設定はデフォルトで以下の状態です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
...
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; https://php.net/post-max-size
post_max_size = 2M
...
; Maximum allowed size for uploaded files.
; https://php.net/upload-max-filesize
upload_max_filesize = 2M
...

なお、upload_max_filesize のみを変更してもエラーは解消しません。どちらもエラーの原因です。

対処法

以下の通り変更します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
...
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; https://php.net/post-max-size
post_max_size = 1G
...
; Maximum allowed size for uploaded files.
; https://php.net/upload-max-filesize
upload_max_filesize = 1G
...

1G は大きすぎる値に感じますが、XServer の初期設定です。XServer は様々なお客様が利用した膨大なユースケースに応じた設定になっているはずなので、1G でほぼ問題が起きることはないということでしょう。

手順

PHP だと /usr/local/etc/php/php.ini が上記の設定ファイルですが、以下の箇所に配置しても反映されません。

1
2
3
4
# pwd
/usr/local/etc/php
# ls
conf.d  php.ini-development  php.ini-production

WordPress ではさらに深い /usr/local/etc/php/conf.d の中の wordpresss.ini で設定されます。

1
2
3
4
5
6
# pwd
/usr/local/etc/php/conf.d
# ls
docker-php-ext-bcmath.ini  docker-php-ext-imagick.ini  docker-php-ext-opcache.ini  error-logging.ini
docker-php-ext-exif.ini    docker-php-ext-intl.ini     docker-php-ext-sodium.ini   opcache-recommended.ini
docker-php-ext-gd.ini      docker-php-ext-mysqli.ini   docker-php-ext-zip.ini      wordpress.ini

もちろん docker exec wordpress xxx のようにコンテナ内でコマンドを実行して変更する方法もありますが、これはコンテナ再作成に伴い元に戻るので、突然またアップロードできなくなる可能性があります。 このため、ローカル環境に置いてある wordpress.ini をコンテナの該当ディレクトリに配置する方式を取ります。

まずは手元に wordpress.ini を用意します。デフォルトではコンテナ内に wordpress.ini は存在しないため、代わりに php.ini-production を再利用します。

1
$ docker exec wordpress /bin/cat /usr/local/etc/php/php.ini-proudction > wordpress.ini

これで手元に wordpress.ini が作成されます。次に、2つの設定値を変更します。これは上述の通り 1G などに変更するといいです。

最後に compose.yml (docker compose のための設定ファイル) に以下の通り記述します

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./wordpress.ini:/usr/local/etc/php/conf.d/wordpress.ini

volumes によってこの設定ファイルと同じディレクトリ内にある wordpress.ini/usr/local/etc/php/conf.d/wordpress.ini に配置されます。 これで WordPress 上に Cocoon テーマをインストールできるようになります。

おまけ

Cocoon は低サイズ版のテーマを用意しており、そちらであれば初期設定でも、また設定を変更できない環境でもアップロードできます。なので、普段からコンテナを利用しておりどうしてもコンテナ化したい場合以外は低サイズ版をアップロードするのが早いでしょう。

ほかの方法として、Custom PHP Settings プラグインを利用する方法があります。このプラグインは、起動しているサーバ上の ini ファイルを画面から編集できるようにするものです。ややこしい設定ファイルをいじる必要がないので、楽に変更できます。ただし、コンテナ環境の場合は再作成でもとに戻るため注意が必要です。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。