2011-08-11 Updated

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にてラップすることで対応しました。他国語対応させる場合には別途検討する必要がありそうです。

お問い合わせ