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 のファイル所有者を変えるかのいずれかになります。
ただし、この操作は、サーバー管理者レベルの権限が必要になるため、結構対応が難しいかもしれません。特に共用のレンタルサーバーとかでは。

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

リリースされてないけど WordPress 4.0 対応(になるかもしれない)プラグインを作ってみた

インストール時の言語選択
インストール時の言語選択

WordPress 4.0 の beta1 が先日発表されましたね。beta1以降は、バグフィックスのみとなり、新しい機能などは盛り込まれないので、よほど致命的なバグがない限り、ほぼこのままということになるでしょう。

どこらへんが変わったかは、おでさんの「WordPress 4.0 ファーストプレビュー」を見てもらうとして、なんと言っても、表示言語をインストール時に選択することで、言語専用のパッケージが基本的に不要になる(残るのかな)ことが一番の変わった点だと思います。

これは、インストール時にインストールするバージョンに対応した翻訳ファイルのリストをオンラインで取得して表示し、選択した言語の翻訳ファイルをインストール時にダウンロードして適用するような仕組みになっています。

select-wplang

また、「一般設定」画面において、マルチサイトには以前から存在していた「サイトの言語」の選択がシングルインストールにおいても利用できるようになり、インストール済みの言語を選べるようになっています。

で、1つ気になったのが、せっかくオンラインから翻訳ファイルを入手する仕組みがあるのに、インストール時しか言語を入手するインターフェースがなさそうだということです。

幸い 4.0 をインストールする際に利用される wp-admin/setup-config.php には、翻訳ファイルの取得やインストール方法も書いてあったので、これを参考に管理画面から翻訳ファイルを追加できるプラグインを作ってみました。

https://github.com/jim912/WP-Language-Plus

wp-lang-plus

added-langs

追加したい言語にチェックを入れて、下部の Install ボタンをクリックすると、翻訳ファイルを追加できるようになっています。

StaticPress でリンク切れの場合はファイルを作らないようにする

一旦、空のファイルを作って、直後に消すようにするという方法です。

add_filter( 'StaticPress::put_content', 'empty_404_content', 10, 2 );
add_action( 'StaticPress::file_put'   , 'unlink_empty_static_file' );
function empty_404_content( $content, $code ) {
	if ( $code == 404 ) {
		$content = '';
	}
	return $content;
}


function unlink_empty_static_file( $file_dest ) {
	if ( file_exists( $file_dest ) && is_file( $file_dest ) && filesize( $file_dest ) === 0 && is_writable( $file_dest ) ) {
		unlink( $file_dest );
	}
}