榊原昌彦

2016/10/22

[超実践] 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と組み合わせての活用をお試しください。

Cookieを利用します

このWebサイトでは、Google Analyticsをアクセス解析のために導入しており、個人データであるCookieにアクセスします。引き続き利用する場合はCookieの利用への同意が必要です。

同意する