(続) `wp-env`で設定ファイルをカスタマイズして走らせると`Error: Could not process the ‘wp-config.php’ transformation.`エラーが出力される

(未解決) `wp-env`で設定ファイルをカスタマイズして走らせると`Error: Could not process the ‘wp-config.php’ transformation.`エラーが出力されるで記述したエラーの原因を特定できたのでメモ。

結果

先に結果を書くと、日本語のコアパッケージをダウンロードすると、wp-config.php内の走査を行う処理の中でデフォルトが英語なので英語のコメントを検索してしまい、一致する文字列がなく例外を投げている、と考えられます。

状況の確認

.wp-env.jsonで以下のように英語以外の言語を指定してダウンロードするようにします(今回は日本語を指定)。

{
    "core": "https://ja.wordpress.org/latest-ja.zip"
}

これでwp-env startすると、以下のようにエラーを吐きだされます。

wp-env start

× Error while running docker-compose command.

Starting XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_mysql_1 … done

Starting XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_wordpress_1 … done

Error: Could not process the ‘wp-config.php’ transformation.

Reason: Unable to locate placement anchor.

ここまでは前回の記事の通り。今回はこの部分をもう少し深堀りします。

調査

まずCould not process the ‘wp-config.php’ transformation.の部分を調べるとWP-CLIのファイルが引っかかります。

        } catch ( Exception $exception ) {
            WP_CLI::error( "Could not process the 'wp-config.php' transformation.\nReason: {$exception->getMessage()}" );
        }

この部分でエラーの1行目から2行目のReason:まで出力していることが分かります。

続いて、Reason:の後ろの部分、Unable to locate placement anchor.を検索します。

すると、wp-configをプログラムから編集するコードがヒットしました。

            if ( false === strpos( $this->wp_config_src, $anchor ) ) {
                throw new Exception( 'Unable to locate placement anchor.' );
            }

この部分ですね。前の部分も合わせて読むと、wp-config.phpファイル中に/* That's all, stop editing!の文字列があるかどうかを見ているようです。

さて、ここで冒頭の.wp-env.jsonに戻ると、今回は日本語のコアパッケージをダウンロードするように指定していました。

そこで、Dockerコンテナ内のwp-config.phpを見てみます。

> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
XXXXXXXXXXXX        wordpress           "docker-entrypoint.s…"   13 minutes ago      Up 13 minutes       0.0.0.0:8888->80/tcp      WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW_wordpress_1
YYYYYYYYYYYY        wordpress           "docker-entrypoint.s…"   13 minutes ago      Up 13 minutes       0.0.0.0:8889->80/tcp      WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW_tests-wordpress_1
ZZZZZZZZZZZZ        mariadb             "docker-entrypoint.s…"   14 minutes ago      Up 14 minutes       0.0.0.0:32775->3306/tcp   WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW_mysql_1

まずはdocker psでコンテナIDを確認(コンテナ名でも良いですが)。このDockerのコンテナIDでbashを起動します。

>docker exec -it XXXXXXXXXXXX bash
root@XXXXXXXXXXXX:/var/www/html# ls
index.php        wp-admin              wp-config.php  wp-links-opml.php  wp-settings.php
license.txt      wp-blog-header.php    wp-content     wp-load.php        wp-signup.php
readme.html      wp-comments-post.php  wp-cron.php    wp-login.php       wp-trackback.php
wp-activate.php  wp-config-sample.php  wp-includes    wp-mail.php        xmlrpc.php
root@XXXXXXXXXXXX:/var/www/html# cat wp-config.php
<?php
/**
 * WordPress の基本設定
 *
 * このファイルは、インストール時に wp-config.php 作成ウィザードが利用します。
 * ウィザードを介さずにこのファイルを "wp-config.php" という名前でコピーして
 * 直接編集して値を入力してもかまいません。
 *
 * このファイルは、以下の設定を含みます。
 *
 * * MySQL 設定
 * * 秘密鍵
 * * データベーステーブル接頭辞
 * * ABSPATH
 *
 * @link https://ja.wordpress.org/support/article/editing-wp-config-php/
 *
 * @package WordPress
 */

//略

define( 'WP_DEBUG', true );

/* 編集が必要なのはここまでです ! WordPress でのパブリッシングをお楽しみください。 */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
        define( 'ABSPATH', __DIR__ . '/' );
}

/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';

root@XXXXXXXXXXXX:/var/www/html#

bashからcatwp-config.phpの中身を覗きます。日本語のコアパッケージなのでwp-config.phpのファイルのコメントも日本語ですね。

だからか!

日本語だと/* 編集が必要なのはここまでです ! WordPress でのパブリッシングをお楽しみください。 */と書いてあるコメントが、英語版のパッケージだと/* That's all, stop editing! Happy publishing. */となっているわけです。当たり前と言えば当たり前ですが。

おそらく、WPConfigTransformer.phpの処理が走る際に、デフォルトの英語として処理が走ってしまい、一致する文字列がないために例外が投げられ、それがエラーとして表出している、という状況と思われます。


さて、原因は大体察しが付きましたが……これはどうやって対応したものか。Issueに投げるのが良いのでしょうか?

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。