WordPress 4.0 で言語パッケージがインストールされない原因を探ってみた

某環境にて、テストで WordPress 4.0(ベータ版)をインストールしてみたのですが、最初の言語選択で日本語を選んだ場合、本来なら

step-0-ja

と日本語表示になるのに

step-0-en

と英語のままとなってしまう現象がありました。

この原因を探っていったところ、ファイルのダウンロードが有効かどうかを調べるチェックの過程で実行される get_filesystem_method が原因であることが分かりました。

具体的には、問題なく動作する環境では、この関数の返り値が direct であるのに対し、失敗する環境では、ftpext が返ってきます。

この違いは、関数内の以下のコードによります。

$context = trailingslashit($context);
$temp_file_name = $context . 'temp-write-test-' . time();
$temp_handle = @fopen($temp_file_name, 'w');
if ( $temp_handle ) {
if ( getmyuid() == @fileowner($temp_file_name) )
$method = 'direct';
@fclose($temp_handle);
@unlink($temp_file_name);
}

コードの内容を簡単に説明すると、$context (インストール時は wp-contentディレクトリのパス)に、検証用の一時ファイルを作成し、そのファイル所有者と、getmyuid 関数で、PHP スクリプト所有者が同一かどうかのチェックを行っています。
このチェックが失敗(所有者が異なったり、ファイルが作成できなかった)した場合、$method に direct が代入されず、ftpext が返ってしまって、最終的に言語ファイルがダウンロード失敗に繋がります。

では、どうすれば良いかというと、検証用の一時ファイルはPHPが作成するため、PHPの実行ユーザーとなります。getmyuid 関数で返るPHP スクリプトの所有者は、インストール時の起動スクリプトである wp-admin/setup-config.php のファイル所有者ですので、これらを同一にすることで解消することができます。

つまり、対処方法は、PHPの実行ユーザーか、setup-config.php のファイル所有者を変えるかのいずれかになります。
ただし、この操作は、サーバー管理者レベルの権限が必要になるため、結構対応が難しいかもしれません。特に共用のレンタルサーバーとかでは。

この現象、結構発生する環境も多いのではないかと思っていて、ちょっと危惧しています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です