wordpressのプラグインでCAKEPHPを利用する方法
cakephpとwordpressのプラグインを統合する方法です。やはりデータベースアクセスやデータバリデーションはcakephpを利用するほうが楽です。そのままでは統合できませんので、いくつか事前準備が必要です。具体的には、cakephpとのブリッジクラスを作成し、そのクラスからcakephpのアクションに処理を委譲させる方法をとります。では、順に見ていきましょう。
cakephpのwebrootにあるindex.phpをcakephp.phpにコピーする
このコピーしたファイルの一番最後の方にあるDispatcherをコメントアウトします。これは、手動でコントローラーを起動するため、自動的にcakephpに処理が委譲しないようにするための措置です。詳細はUsing CakePHP in external PHP Systemsを参照してください。
//$Dispatcher = new Dispatcher(); //$Dispatcher->dispatch();
cakephp側のコントローラーにメソッドを追加する
次に、wordpressから処理が委譲されるメソッドを作成します。このメソッドは本来のcakephpで実行されると宜しくないので、メソッドの頭に「_」をつけてprivateにして宣言します。また、表示させるviewも作成します。この例では_wp_admin_indexと_wp_admin_listを作成しています。
//=================================================
//Wordpress側の管理画面用のメソッド
//================================================
function _wp_admin_index() {
$this->layout = 'wp-admin';
echo $this->render("_wp_admin_index");
}
function _wp_admin_list() {
$this->layout = 'wp-admin';
echo $this->render("_wp_admin_list");
}
wordpress用のlayoutファイルを作成する
通常のlayout.ctpだと不要なデザインが含まれる可能性があるため、wordpress専用のlayoutファイルを作成します。
<?php echo $this->Session->flash(); echo $content_for_layout;
wordpressのプラグインを作成する
<?php
/*
Plugin Name: Test
Plugin URI: http://www.mnsite.com
Description: Test Plugin
Author: MNSoft
Author URI: http://www.mnsite.com/
Version: 0.1
*/
add_action('admin_menu', 'my_plugin_menu');
function my_plugin_menu() {
add_menu_page('テストページタイトル','インデックス',8,
__FILE__, 'wp_admin_index');
//第一引数が__FILE__なのは、parentに自分自身がくるため。
//第5引数は適当?重複するとダメ
add_submenu_page(__FILE__,'リスト','リスト',8,
'list', 'wp_admin_list');
}
//これらが、cakephpへのブリッジメソッドとなる
function wp_admin_index() {
$cake = new WPCakePHP();
$cake->action(_wp_admin_index);
}
function wp_admin_list() {
$cake = new WPCakePHP();
$cake->action(_wp_admin_list);
}
//cakephpのwordpressラッパー
class WPCakePHP {
var $controller;
//引数で指定されたcakephpのメソッドに処理を委譲する
function action($act) {
require_once($_SERVER['DOCUMENT_ROOT'].'/webroot/cakephp.php');
//ここでの例ではTestsControllerを想定
App::import('Controller', 'Tests');
$this->controller = new TestsController();
$this->controller->constructClasses();
$this->controller->$act();
}
}
?>
最後に
備忘録としての意味もあり、駆け足で書きました。これからもう少し情報を拡充していきます。まずは、これがもっとも基本的な連携だと思います。ちなみに、cakephpとwordpressを連動させるとstripslashes_deepと__メソッドで重複宣言のエラーが発生します。今後修正されることを期待しますが、これの暫定措置としてcakephpのbasic.phpでfunction_existsにてラップすることで対応しました。他国語対応させる場合には別途検討する必要がありそうです。



