新規ブログ登録でブログ専用のテーマディレクトリをセットアップ

wordpressマルチサイトでブログの新規セットアップ時にブログ単位のテーマフォルダを作成

PHPでディレクトリの中身を再帰的にコピーする

マルチサイト構成でブログ毎に異なるテーマディレクトリを設定する作業は重めのタスクで、拘りがなければシングルサイト構成にしてテーマをブログ毎に管理するほうがおすすめであることは以前書いた。

シングルサイト構成がおすすめではあるが、マルチサイト環境下でテーマをブログ単位で管理できるようにセットアップするプラグインを作成している。ブログ単位でインストール済みのテーマリストの参照先を変更する方法については以前エントリーしてあるので参考になればよいと思う。

今回のエントリーは、ブログの初期セットアップ時にブログサイト専用のディレクトリを構成する処理について書いてみる。処理内容は、

  • デフォルトテーマのコピー
  • シンボリックリンクの設定

シンプルに表現すると上記の二つを設定することになる。

前者については、簡単にいってしまうとディレクトリのコピーになる。具体的には、wordpress3.8時点の標準テーマである、

  • twentyfourteen
  • twentythirteen
  • twentytwelve

をブログ申し込みのたびにコピーするという内容になる。phpにはファイルのコピーやフォルダを作成する関数は用意されているが、個々のテーマフォルダの中身を再帰的にコピーする関数は用意されていないようで、webで検索して以下のプログラムを使わせてもらうことにした。

http://www.searchai.jp/cgi/php.php#8

dir_copyという関数をプラグインのfunctionとして設定すればプラグイン内からdir_copy()を利用できるようになる。

dir_copyの使い方

wordpressのプラグイン内でdir_copyを利用方法を中心にテーマディレクトリのセットアップ処理を書いてみたい。まず、新規セットアップのアクションフックを設定する。

add_action('wpmu_new_blog', array($this, 'wpsetup'));

wpsetupは以下のようにしてみた。

switch_to_blog( $blog_id );

$org = 'C:/xampp/htdocs/vhost/wordpress3.8ja/wp-content/themes/org'; // 標準テーマが格納されている
$dest = 'C:/media/themes/sites/'.$blog_id; // コピー先ディレクトリ

$this->dir_copy($org, $dest); // dir_copyを呼び出し標準テーマをコピー

$target = 'C:/media/themes/sites/'.$blog_id; //symlink先を指定
chdir('C:/xampp/htdocs/vhost/wordpress3.8ja/wp-content/themes/sites'); //ディレクトリの変更
$link = $blog_id; // symlink元としてブログIDを指定
symlink($target, $link); // symlink作成

restore_current_blog();

上のコードにより

  • ブログ専用のテーマディレクトリの作成
  • 標準テーマのコピー
  • symlinkの設定

という一連の処理を行うことができる。

テーマの保存先をwordpressのルートから外して、システムルート直下に設定・保存することでwordpressパッケージ内を常に身軽にしておく設定でもある。テーマディレクトリだけでなく、メディアディレクトリ(画像など)のパスの変更も可能なので、興味があるひとはそちらも参考にしてほしい。