WP_Queryのカスタマイズ事例(3)親子( 先祖・子孫)クエリー。

カスタム投稿タイプの先祖の表示。

前回※1 「投稿のカスタムフィールドに関連付けられた投稿の表示」で、ブログ記事に文献の情報を関連付ける事例を紹介しました。(実際の画面サンプルはこちらです。)

この例では、「第八章 月島の商業」が関連付けられていますが、この上の階層である「第三編 明治以降の月島」と最上位階層である書籍名の「月島発展史」を併せて表示しています。

カスタム投稿タイプ「参考文献」は、親子関係を持った木(ツリー)構造になっていて、最初に関連付けされた「第八章 月島の商業」をキーに、祖先(父母→祖父母)の階層を表示しています。

リスト37639は、カスタム投稿タイプの祖先を表示するコードです。

カスタム投稿タイプの子孫の表示。

カスタム投稿タイプ「参考文献」の全体を一覧表示する場合は、階層のトップのIDを指定し、それをキーに子孫の階層を上から順番に検索して表示します。(実際の画面サンプルはこちらです。)

リスト37639は、投稿の子孫を表示するコードです。WordPressのテンプレートタグ「get posts」を使って子孫を検索しています。 

タクソノミーの祖先と子孫の表示

木(ツリー)構造を持つタクソノミーの全体を表示する事例を紹介します。(実際の画面サンプルはこちらです。)

たとえば「中央区」を選択した場合、祖先に東京都、子孫に月島3丁目があります。これらの表示をクリックするとどちらにでも移動できるようにすると便利です。また、自分が現在どの階層にいるかも解りやすくなります。

リスト36732は、タクソノミーの祖先と子孫の両方を表示する事例です。現世代の「中央区」を指定すると、まずその先祖を表示し、次に子孫を表示します。

参考文献

参考記事

コード例

事例1:カスタム投稿の先祖を表示

呼び出す側

$par2->gen_id = '18661';
$par2->post_type = 'reference' ;
$user = new Model37639() ;
    $user->generation($par2) ;

呼び出される側(クラス)

class Model37639 extends WP_Query
{
	public function generation($par2)
	{
		$ance = array() ;
		$ance = get_ancestors($par2->gen_id, $par2->post_type) ;
		//$cnt = count($ance);
		$ance = array_reverse($ance) ;
		$k = 0 ;
		While ( !empty($ance[$k])) {
			$par2->id = $ance[$k] ;
			$par2->k = $k  ;
			$View_obj = new View37639a($par2) ;
			$k = $k +1 ;
		}//endwhile
	}//endfunction

}//endclass

class View37639a
{
	public function __construct($par2)
	{
		$postslist = get_post($par2->id) ;
 		setup_postdata($postslist);
		echo $postslist->post_title."<br>\n" ;
		
	}//endfunction
}//endclass

Warning: Creating default object from empty value in /home/xs663544/kokontouzai.jp/public_html/wp-content/plugins/wp-OOP/wp-OOP-CodeSample.php on line 508

ID: 18661
先祖
k=0 18444月島発展史
k=1 18665第三編 明治以後の月島
現世代
k=2 18661第八章 月島の商業

事例2:カスタム投稿の子孫を表示

呼び出す側

$par2->gen_id = '18444';
$par2->post_type = 'reference' ;
echo "<br>\n".'ID: '.$par2->gen_id."<br>\n" ;
$user = new Model37642() ;
    $user->generation($par2) ;

呼び出される側(クラス)

class Model37642 extends WP_Query
{
	public function __construct()
	{
//コンストラクタは、なぜ今回使わないのか。
	}//endfunction
	
	public function generation($par2)
	{

//現世代を表示
		echo '現世代'."<br>\n" ;
		$par2->id = $par2->gen_id ;
		$par2->k = 0 ;
		$View_obj = new View37642a($par2) ;
		
//子孫を表示
		echo '子孫'."<br>\n" ;
		$this->children($par2) ;		
	}
	
	public function children($par2)
	{
//抽出処理
		$k = $par2->k ;	
		$args = array(
			'post_type' => $par2->post_type ,			
			'post_parent' => $par2->id ,
			'orderby' => 'menu_order',
			'order'   => 'ASC',
		);
		$the_query = get_posts($args) ;
		if(empty($the_query)){
			return ;
		}
//ループ処理
		$k = $k +1 ;
		foreach($the_query as $query){
			$par2->id = $query->ID ;
			$par2->k = $k ;			
			$View_obj = new View37642a($par2) ;
			$this->children($par2) ;//再帰処理。
		}
		
	}//endfunction
}//endclass

class View37642a
{
	public function __construct($par2)
	{
		$postslist = get_post($par2->id) ;
 		setup_postdata($postslist);
		echo 'k='.$par2->k.' '.$par2->id ;
		echo $postslist->post_title."<br>\n" ;
		
	}//endfunction
}//endclass

Warning: Creating default object from empty value in /home/xs663544/kokontouzai.jp/public_html/wp-content/plugins/wp-OOP/wp-OOP-CodeSample.php on line 433

ID: 18444
現世代
k=0 18444月島発展史
子孫
k=1 18669第二編 江戶時代の月島
k=2 18675第一章 石川島佃島の塡築
k=1 18665第三編 明治以後の月島
k=2 18445第二章 月島、新佃島の填築
k=2 18661第八章 月島の商業

事例3:タクソノミーの先祖と子孫を同時表示

呼び出す側

$par2->gen_id = '9790';
$par2->entity_name = 'region' ;
echo "<br>\n".'ID: '.$par2->gen_id."<br>\n" ;
$user = new Model36732() ;
    $user->generation($par2) ;

呼び出される側(クラス)

class Model36732//計算するクラス。
{
	public function __construct()
	{
//コンストラクタは、なぜ今回使わないのか。
	}//endfunction
	
	public function generation($par2)
	{
		$ance = array() ;
		$ance = get_ancestors($par2->gen_id, $par2->entity_name) ;
		//$cnt = count($ance);
		$ance = array_reverse($ance) ;

//////先祖が存在しない場合、$anceは中身は空なので、次の処理へ進む。
//先祖を表示。
echo '先祖'."<br>\n" ;
		$k = 0 ;
		While ( !empty($ance[$k])) {
			$par2->id = $ance[$k] ;
			$par2->k = $k ;
			$View_obj = new View36732a($par2) ;
			$k = $k +1 ;
		}//endwhile

//現世代を表示
echo '現世代'."<br>\n" ;
		$par2->id = $par2->gen_id ;
		$par2->k = $k ;
		$View_obj = new View36732a($par2) ;
		
//子孫を表示
echo '子孫'."<br>\n" ;
		$this->children($par2) ;		
	}
	
	public function children($par2)
	{
//抽出処理
		$k = $par2->k ;	
		$args = array(
			'parent' => $par2->id ,	
		);
		$the_query = get_terms($par2->entity_name, $args) ;
		if(empty($the_query)){	
			return ;
		}
//ループ処理
		$k = $k +1 ;
		foreach($the_query as $term){
			$par2->id = $term->term_id ;
			$par2->term = $term ;//$par2に追加。
			$par2->k = $k ;//$par2に追加。
			$View_obj = new View36732b($par2) ;
			$this->children($par2) ;//再帰処理。
		}
		
	}//endfunction
}//endclass

class View36732a//表示するクラス。
{
	public function __construct($par2)
	{
		$term = get_term($par2->id , $par2->entity_name ) ;
		echo 'k='.$par2->k.' '.$par2->id ;
		echo $term->name."<br>\n" ;
	}//endfunction

}//endclass

class View36732b//表示するクラス。
{
	public function __construct($par2)
	{
		echo 'k='.$par2->k.' '.$par2->id ;
		echo $par2->term->name."<br>\n" ;
	}//endfunction

}//endclass

Warning: Creating default object from empty value in /home/xs663544/kokontouzai.jp/public_html/wp-content/plugins/wp-OOP/wp-OOP-CodeSample.php on line 564

ID: 9790
先祖
k=0 7079全国
k=1 2740東京都
現世代
k=2 9790中央区
子孫
k=3 12370日本橋室町3丁目
k=3 12404日本橋室町1丁目
k=3 12405日本橋富沢町
k=3 12406日本橋大伝馬町
k=3 10164日本橋中洲
k=3 10160日本橋人形町二丁目
k=3 2751日本橋人形町一丁目
k=3 10163日本橋人形町三丁目
k=3 10161日本橋箱崎町
k=3 10162日本橋小網町
k=3 9907日本橋本町一丁目
k=3 10076日本橋本町四丁目
k=3 2748八丁堀三丁目
k=3 9903八重洲一丁目
k=3 9908八重洲二丁目
k=3 2750京橋三丁目
k=3 7442八丁堀二丁目
k=3 2747銀座二丁目
k=3 10061銀座三丁目
k=3 10062銀座四丁目
k=3 10063銀座五丁目
k=3 10064銀座六丁目
k=3 10059銀座七丁目
k=3 10058銀座八丁目
k=3 2749新富1丁目
k=3 9788築地2丁目
k=3 10508築地7丁目
k=3 2752新川1丁目
k=3 10509新川2丁目
k=3 12355日本橋室町2丁目
k=3 9880佃1丁目
k=3 9789月島3丁目

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です