仕事でWordPressを触ることになって色々やっているのですが、管理上の都合で「wp-content」ディレクトリをWordPressディレクトリの外に出して使いたかったので、「wp-content」ディレクトリの場所を変更しました。
具体的なディレクトリ構成はこんな感じ:
├ /www
│ └ wp-content
└ /wp
├ wp-admin
└ wp-includes
変更するには、wp-config.phpに以下を追記します。
define('WP_CONTENT_DIR', dirname(__FILE__) . '/../www/wp-content');
define('WP_CONTENT_URL', 'http://hoge/wp-content');
参考
wp-content の移動とリネーム – WordPress セキュリティ対策デモサイト
でもこれだとテーマの編集で問題が起きます。
「外観 > テーマ編集」でテーマのカスタマイズをしようとすると、次のエラーメッセージが出てしまいます。そのファイルは編集できません。
検索してみると「パーミッションの問題ではないか」という情報が見つかりますが(https://ja.forums.wordpress.org/topic/3017)、いろいろやってみたけれど改善せず。仕方が無いのでwordpressのソースコードを読んでみたらこんな記述を発見。
function validate_file( $file, $allowed_files = '' ) {
if ( false !== strpos( $file, '..' ) )
return 1;
if ( false !== strpos( $file, './' ) )
return 1;
if ( ! empty( $allowed_files ) && ! in_array( $file, $allowed_files ) )
return 3;
if (':' == substr( $file, 1, 1 ) )
return 2;
return 0;
}
これはファイルが正しいかどうかをチェックする関数で、返り値が0以外のときはエラーになります。
今回のエラーの場合、1が返っているのでその条件を見てみるとファイル名に「..」「./」のいずれかが含まれている場合にエラーが出るとのこと。恐らく意図せず上位ディレクトリにアクセスしてしまうのを回避するための措置だと思うのですが、これを踏まえて先に「wp-config.php」に書いた内容を見直すと、ファイル名が次のようになっていることがわかりました。
/hoge/wp/../www/wp-content/themes/twentytwelve/archive.php
ダメじゃん。
というわけで、wp-config.phpの記述を以下のように変更。
define('WP_CONTENT_DIR', realpath(dirname(__FILE__) . '/../www/wp-content'));
define('WP_CONTENT_URL', 'http://hoge/wp-content');
こうするとファイル名が以下のようになって解決。
/hoge/www/wp-content/themes/twentytwelve/archive.php
よかった、よかった。