wordpress register_theme_directoryの使い方

テーマを格納するフォルダを増やすことができる

register_theme_directoryはグローバル変数$wp_theme_directoriesを操作する

wordpressの初期設定でテーマが格納されるディレクトリは、

wp-content\themes

になっている。

マルチサイト構成でブログ単位でテーマの参照および保存先をフレキシブルにしようとしているのでいろいろと調べたところ、

register_theme_directory

を利用して参照先ディレクトリを変更できる。しかしながら、純粋なregister_theme_directoryの利用はディレクトリの追加であって変更するためのものではないようだ。

register_theme_directoryでディレクトリを追加すると追加したフォルダ内のテーマも合計して[インストールされているテーマ]に表示される。また、[テーマ編集]のページでも合計したテーマを選択可能になる。

ブログ単位で参照できるテーマリストを変更したいため、register_theme_directoryの動作を調べてみた。基本的な利用方法は以下のとおり。

global $current_user;

get_currentuserinfo();
$user_info = get_userdata($current_user->ID);

$directory = 'themes/sites/'.$user_info->primary_blog;
$result = register_theme_directory( $directory );

上のやり方でテーマディレクトリが追加される。追加であって変更ではない。どこに追加されるかを調べるには以下のようにコードを変更して$wp_theme_directoriesを確認する。

global $current_user;
global $wp_theme_directories;
get_currentuserinfo();
$user_info = get_userdata($current_user->ID);

$directory = 'themes/sites/'.$user_info->primary_blog;
$result = register_theme_directory( $directory );

echo '<pre>';
var_dump($wp_theme_directories);
echo '</pre>';

すると以下のように配列でテーマディレクトリを追加していることが確認できる。wordpressは、$wp_theme_directoriesのフォルダ情報をすべて参照してテーマリストを構築している。

array(2) {
  [0]=>
  string(54) "C:\xampp\htdocs\vhost\wordpress3.8ja/wp-content/themes"
  [1]=>
  string(62) "C:\xampp\htdocs\vhost\wordpress3.8ja/wp-content/themes/sites/5"
}

そのため、ブログ単位でテーマリストを分けたい場合には、register_theme_directoryで新規に階層を追加するだけでは思い通りにならない。ただし、上のような状態が理解できていれば、後は純粋なphpの配列操作で意図する結果にもっていける。例えば以下のようにしてみた。

global $current_user;
global $wp_theme_directories;
get_currentuserinfo();
$user_info = get_userdata($current_user->ID);

$directory = 'themes/sites/'.$user_info->primary_blog;
$result = register_theme_directory( $directory );

for( $i = 0; count($wp_theme_directories) > $i; $i++ )
{
	if( strpos($wp_theme_directories[$i], $directory) === false )
	{
		unset($wp_theme_directories[$i]);
	}
}

$wp_theme_directories = array_values($wp_theme_directories);

ユーザーの属するブログ単位でフォルダ階層を作成し、その階層に該当しない配列を削除して、その後配列の整理を行っている。

まとめ

wordpressのマルチサイト環境でブログ単位でテーマディレクトリを分割するのは鬼門かもしれない。

拘りがなければシングルサイト構成にして各ブログでテーマ管理を行ったほうが断然楽にシステムを構築できる。マルチサイト構成でテーマ管理をブログ毎に分ける必要がある場合には、本エントリーで書いた参照系テーマリストのカスタマイズのほうかに、アップロード先ディレクトリのカスタマイズが必要になってくる。

印象としては、アップロード先をフレキシブルな構成にするほうがシンプルに対応できると考えているが、参照系と合わせてシステムを構成した場合の

  • 十分なテスト
  • wordpressのアップデート

を考慮するとマルチサイトの鬼門と考えてよいと思う。

Webエンジニアブログにコメント

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

wordpress register_theme_directoryの使い方の記事にコメントを投稿