[超実践] CodeIgniterをつかって、WordPressサイトを拡張しよう

2016年10月22日

こんにちは、榊原です。
先日、テクテク関西に『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というフォルダ名で配置します。

この時点でのフォルダ階層は以下の通りです。
 

ProjectName/
├── application/
├── composer.json
├── composer.lock
├── public/
├── vendor/
└── wordpress/

 
ついで、WordPressをルートに配置するために、ProjectNameにWordPressのindex.phpを外出しします。(参考 : WordPress を専用ディレクトリに配置する
 

ProjectName/
├── application/
├── composer.json
├── composer.lock
├── public/
├── vendor/
├── wordpress/
├── index.php ←WordPressのindex.php
└── .htaccess ←WordPressの.htaccess

 
結構形になってきました。しかしながら、この形だとルートへのアクセスでWordPressにアクセスできますが、CodeIgniterへのアクセスがProjectName/publicでちょっと名前が格好わるいので、publicをappsにリネームします。
 

ProjectName/
├── application/
├── composer.json
├── composer.lock
├── apps/  ← public/ をリネーム
├── vendor/
├── wordpress/
├── index.php ←WordPressのindex.php
└── .htaccess ←WordPressの.htaccess

 
だいぶ、形になってきましたね。

独自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();とかも使えるのでほんっと便利です。
 

class Inside extends CI_Controller {

function __construct()
{
parent::__construct();
}

public function index()
{
include dirname(__FILE__).”/../../wordpress/wp-load.php”;
$this->load->view(‘inside_index’);
}
}

 

まとめ

WordPress本体がどんどん疎結合を目指しているのに、WordPressの拡張をプラグインやテーマだけでがんばるのは不毛ですよね。ぜひ、CodeIgniterと組み合わせての活用をお試しください。

slackチームに参加下さい

ng-onsenui2.slack.com

OnsenUI2(Angular2)について知見を共有する場です。Angular2に限ってOnsenUI2を議論できる場がなかったのでつくりました。これから使い始めるという方はぜひご参加ください。
https://ng-onsenui2.herokuapp.com/

Ionic2.slack.com

日本語情報が少ないのでこちらで知見を共有できればと思います。お陰様で参加者100名を超えました。ありがとうございます。
https://ionic2-ja.herokuapp.com