[超実践] CodeIgniterをつかって、WordPressサイトを拡張しよう
こんにちは、榊原です。
先日、テクテク関西に『Web前線(最前線というにはおこがましかった)|WordPress APIが見据えたのは「疎結合なWebな世界」』という記事を寄稿しましたが、今回はそれに関連する形で「じゃあ、WordPressのサイトを、WordPressではなくCodeIgniterで拡張しようよ」話をしようと思います。
コンセプト
WordPressを拡張するのは、プラグインを利用するのが一般的です。で、公開されているプラグインにやりたいことがなければ自分で作ってしまう。しかしながら、やっていることはデータベースからデータを引っ張ってきて、加工して表示するだけで、この処理って普通にPHPで実装するものですよね。でしたら、WordPressという制限の中でつくるよりも、PHPフレームワークでコーディングしちゃった方が楽ですよね。普通にテストとか書きやすいし。
ということで、WordPressとPHPフレームワークを同居させて、拡張部分はPHPフレームワークのひとつであるCodeIgniterでつくってしまいます。
制限
実装話の前に、先にできないことについて書いておきます。
まず、WordPressのルーティングの中でCodeIgniterのルーティングを使うのは無理です。WordPressがhttp://hoge.jp/
にインストールされてるとすると、http://hoge.jp/user
みたいなURLでCodeIgniterへのpathはつなげません。どうしてもhttp://hoge.jp/apps/user
みたいな形になります。
二つ目は、helperの衝突が起こりますので、CodeIgniterのURLヘルパーはそのままでは使えません。後述しますが、独自のURLヘルパーを再実装する形になります。
逆にいえば、この2点以外はCodeIgniterでWordPressの関数を操作したりすることもでき、かなり自由です。
実装してみよう
install
本章では、WordPressがルートにあり、その下にCodeIgniterを設置することにします。まずは、CodeIgniterをインストールします。もちろん保守性をあげて管理しやすくするためのPHPフレームワーク利用ですのでComposerで入れます。CodeIgniter Composer Installerを利用します。
$ composer create-project kenjis/codeigniter-composer-installer ProjectName
すると、ProjectNameというフォルダの中にCodeIgniterがインストールされます。ついで、ProjectNameの中に、WordPressをwordpress
というフォルダ名で配置します。
この時点でのフォルダ階層は以下の通りです。
[html]ProjectName/
├── application/
├── composer.json
├── composer.lock
├── public/
├── vendor/
└── wordpress/[/html]
ついで、WordPressをルートに配置するために、ProjectNameにWordPressのindex.phpを外出しします。(参考 : WordPress を専用ディレクトリに配置する)
[html]ProjectName/
├── application/
├── composer.json
├── composer.lock
├── public/
├── vendor/
├── wordpress/
├── index.php ←WordPressのindex.php
└── .htaccess ←WordPressの.htaccess[/html]
結構形になってきました。しかしながら、この形だとルートへのアクセスでWordPressにアクセスできますが、CodeIgniterへのアクセスがProjectName/public
でちょっと名前が格好わるいので、publicをappsにリネームします。
[html]ProjectName/
├── application/
├── composer.json
├── composer.lock
├── apps/ ← public/ をリネーム
├── vendor/
├── wordpress/
├── index.php ←WordPressのindex.php
└── .htaccess ←WordPressの.htaccess[/html]
だいぶ、形になってきましたね。
独自URLヘルパーを実装
CodeIgniterには、urlヘルパーという便利な関数があるのですが、これはWordPressの関数と衝突するために使うことができません。そこで、独自URLヘルパーを実装します。
といっても、CodeIgniterのURLヘルパーの関数をリネームするだけです。GitHubにコードあげておきますので、このコードをapplication/helpers/ci_url_helper.php
として配置してください。
share-code/ci_url_helper.php
urlヘルパーを使う際は、こちらを呼び出すようにしてください。
これで、環境設定は完了です。あ、PHPUnitでテスト書きたい人は、kenjis/ci-phpunit-testを使ったりしてください。今回は触れません。
CodeIgniterでWordPressのコアをinclude
コアをincludeします。そしたら、WordPress関数使えます。もちろん、get_header();
とかも使えるのでほんっと便利です。
[html]class Inside extends CI_Controller {
function __construct()
{
parent::__construct();
}
public function index()
{
include dirname(__FILE__)."/../../wordpress/wp-load.php";
$this->load->view(‘inside_index’);
}
}[/html]
まとめ
WordPress本体がどんどん疎結合を目指しているのに、WordPressの拡張をプラグインやテーマだけでがんばるのは不毛ですよね。ぜひ、CodeIgniterと組み合わせての活用をお試しください。