これまで、WP_Queryのカスタマイズ事例※1※2※3を示してきましたが、今回は、このうちのDestinationパターン※1とSourceパターン※2の事例を統合した万能型サブクエリーについて解説します。
WP_Queryのカスタマイズ事例(4)万能型サブクエリー
参考文献
参考記事
※1WP_Queryのカスタマイズ事例(2)Sourceパターン( meta_queryとtax_query)※2WP_Queryのカスタマイズ事例(1)Destinationパターンコード例
事例1:万能型カスタムWP_Query
呼び出す側
$args = array(
'model' => '37694',
'view' => '37694',
'pattern_m' => 'Sour',
'entity_from' => 'Term',
'entity_to' => 'Post',
'post_type' => 'post',
'tax' => array('region','genre'),//タクソノミー名:地域、ジャンル
'field_value' => array('9790','10274'), //タクソノミーの値:中央区、商店街
);
$user = new Controller37694($args) ;
Controllerクラス
class Controller37694
{
public function __construct($args)
{
//////配列をオブジェクトに変換
$par =(object)$args;
//////Modelメソッドの呼び出し
$model_name = 'Model'.$par->model ;
$model_obj = new $model_name($par) ;
}//endfunction
}//endclass
Modelクラス
class Model37694
{
public function __construct($par)
{
//参照パターン毎に$argsの値を設定するため、分岐させるための$args_nameの値を設定。
$args_name = $par->pattern_m.$par->entity_from.$par->entity_to ;
if ($args_name == 'SourTermPost'){
$query_name = 'tax_query' ;
}elseif($args_name == 'SourPostPost'){
$query_name = 'meta_query' ;
}
$args = array(
'order' => $par->order,
'orderby' => $par->orderby,
'include' => $par->foreign_key,//タクソノミー用DPT
'hide_empty' => false,//Listのとき要DPT
'meta_key' => $par->meta_key,//DPP
'post_type' => $par->post_type,//DPP
'post__in' => $par->foreign_key,//DPP
'posts_per_page' => -1,//全行表示DPP
$query_name => array(
'relation' => $par->orand ,
array(
'taxonomy' => $par->tax[0],
'field' => 'term_id',//STP
'terms' => $par->field_value[0],//STP
'key' => $par->field[0],//SPP
'value' => $par->field_value[0],//SPP
),
array(
'taxonomy' => $par->tax[1],
'field' => 'term_id',//STP
'terms' => $par->field_value[1],//STP
'key' => $par->field[1],//SPP
'value' => $par->field_value[1],//SPP
)
)
);
if ($args_name == 'DestPostTerm'){
$the_query = get_terms($par->tax, $args);
}else{
$the_query = new WP_Query($args) ;
}
////////////////////表示ループ
//Viewクラスのクラス名を設定
$view_name = 'View' . $par->view;
$num = 0 ;
//表示するエンティティがpostの場合
if ($par->entity_to == 'Post'){
//while文でのループ処理
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
$num = $loopcounter++ +1;
if ($num == '1' && !empty($par->title)){
echo '<h2>' . $par->title . '</h2>' ;//タイトルを表示
}
//カウントアップした番号$numをオブジェクト$parに設定
$par->num = $num ;
//Viewオブジェクトをインスタンス化
$view_obj = new $view_name($par);
}// end while
wp_reset_postdata();
}//end if
//表示するエンティティがtermの場合
}elseif ($par->entity_to == 'Term'){
echo '<h2>' . $par->title . '</h2>' ;
//foreach文でのループ処理
foreach ($the_query as $term){
$num = $loopcounter++ +1;
//カウントアップした番号$numと表示するオブジェクト$termをオブジェクト$parに設定
$par->term = $term ;
//Viewオブジェクトをインスタンス化
$view_obj = new $view_name($par);
}//endforeach
}else{
}//endif
}//endfunction
}//endclass
Viewクラス
class View37694
{
public function __construct($par)
{
the_title() ;
echo "<br>\n" ;
}//endfunction
}//endclass
築地(西仲通り商店街)明治時代の埋め立て工事により出来上がった町。