(未解決) `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からcatでwp-config.phpの中身を覗きます。日本語のコアパッケージなのでwp-config.phpのファイルのコメントも日本語ですね。
だからか!
日本語だと/* 編集が必要なのはここまでです ! WordPress でのパブリッシングをお楽しみください。 */と書いてあるコメントが、英語版のパッケージだと/* That's all, stop editing! Happy publishing. */となっているわけです。当たり前と言えば当たり前ですが。
おそらく、WPConfigTransformer.phpの処理が走る際に、デフォルトの英語として処理が走ってしまい、一致する文字列がないために例外が投げられ、それがエラーとして表出している、という状況と思われます。
さて、原因は大体察しが付きましたが……これはどうやって対応したものか。Issueに投げるのが良いのでしょうか?