WordPressはイベント駆動型モデルであると言われています。これは、URLを指定するだけで自動的にデータを取得(メインクエリー)し、自動的にテンプレートファイルを選択して画面表示(メインループ)するものです。
しかし、カスタム投稿タイプやカスタムタクソノミーを使ったWebアプリケーション開発に重きを置く場合は、サブクエリーを多用する場面が増えてきます。
WordPressには、サブクエリーを効率よく開発するためのモデルがありません。
今回は、サブクエリーを効率よく開発するために、MVCモデルを適用することについて解説します。
MVCモデルは、Modelクラス、Viewクラスにコードを集約し、オブジェックト指向の継承やオーバーライドを使って、類似のコードを抽象化することによって、コーディングの作業を軽減することができます。
次にオブジェクト指向でないコード(従来の書き方)とMVCモデルを使ったオブジェクト指向のコードを比較してみることにします。
オブジェクト指向でないコード
//サブクエリー
$args = array(
//条件の記述
);
//WP_Query
$the_query = new WP_Query($args) ;
//サブループ
if($the_query->have_posts()){
While($the_query->have_posts()){
$the_query->the_post();
//表示の記述
the_title() ;
echo "<br>\n" ;
}
}//endif
オブジェクト指向のコード(MVCモデル)
class Controller
{
public function __construct($var){
$par =(object)$var;
$user = new Model($args);
または
$user = new ViewPost() ;
$user->format();
}
}
class Model
{
public function __construct($var)
{
//サブクエリー
$args = array(
//条件の記述
);
//WP_Query
$the_query = new WP_Query($args) ;
//サブループ
if($the_query->have_posts()){
While($the_query->have_posts()){
$the_query->the_post();
//Viewクラスの呼び出し
$user = new ViewPost() ;
$user->format();
}
}//endif
}//endfunction
}//endclass
class View
{
public function __format()
}//endfunction
}//endclass
class ViewPost extends View
{
public function __format()
//表示
the_title() ;
echo "<br>\n" ;
}//endfunction
}//endclass
//呼び出す側
$args = arry(
//条件の記述
);
$user = new Controller($args);
サブクエリー(WP_Query)とサブループは、書き方のパータンがたくさんあり、すべてのパターンを覚えるのは大変なことです。そのため、書くたびにコードディングミスが起こり、完成するまでに時間がかかります。当然のことながら、これをメンテする作業も大変です。
これに対し、オブジェクト指向で書かれたコードは、呼び出す側は、フィルタリング条件を記述してクラスを呼び出すだけで、サブクエリー~サブループ~表示までの処理が完了します。
もちろん、呼び出される側のクラスとして、Controllerクラス、Modelクラス、Viewクラスがあり、これらのコードを合わせると、オブジェクト指向を使った場合の方がコードの量は格段に増えます。しかし、これらのクラスは、再利用することを前提に作成していますので、次回からは、呼び出す側の記述のみで済みます。
また、クラスには、スーパークラス(親クラス)の機能を継承して、差分の部分のみをサブクラス(子クラス)に記述することができ、メンテの効率が向上します。