20150426_01.jpg


仕事で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


よかった、よかった。



ちなみに

色々調べているときに、WordPressのセキュリティ的な問題で、この「テーマ編集」は使うべきではないという意見をたくさん見掛けました。確かに管理ツールにアクセス出来てしまえば、Webサイトを改ざんし放題なわけで、あまり使うべきではないかも知れませんね。開発が完了したら、パーミッションを変更して編集が出来ないようにすべきかもしれません。