万能型カスタム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

参考文献

参考記事