wordpress:固定ページで親ページ、最上位ページを取得する
wordpressの固定ページでは親子階層を作ることが可能です。
ブログ程度では余り使わないですが、コーポレートサイトになると出番が結構あったり。
なので親ページ・最上位ページを取得する方法を書いてみました。よろしければ御覧ください。
2016/02/16追記:
wordpressにはget_post_ancestorsなる関数がありました…orz
基本やってることは一緒ですが、ちょっとだけ違うのでこのまま掲載しておきます。
1つ上の親を取得
単純に1階層上のページを取得します。
子ページから親ページの情報を取得するということですね。
$post->post_parent
もはやお馴染み。
wordpressのポストデータにはすでに親記事のIDが保存されているのでそれを出力するだけです。
echo esc_html( $post->post_parent ); //結果 207
そのページのデータを取得したいのならget_post()ですね。
$parent = get_post( $post->post_parent ); echo esc_html( $parent->post_title ); //結果 親ページ
多重階層の最上位ページを取得
問題になってくるのが多重階層の場合。
こんなの
ひ孫ページから親ページを取得したい場合です。
wordpressにはページの階層を保存してるデータはないので別途取得してやる必要があります。
結構使うかなーと思って関数化してみたのでよかったら使ってみてください。
get_page_parent()
functions.phpに下記コードを追加して下さい。
function get_page_parent( $parent_id , $object = true , $root = true ) { //parent_idが0の場合何もしない if( $parent_id == false ) { return false; } if( $object == true ) { //返り値がpostオブジェクト while( $parent_id ) { $page = get_post( $parent_id ); $result[] = $page; $parent_id = $page->post_parent; } } else { //返り値がpostID while( $parent_id ) { $page_id = get_post_field( 'post_parent' , $parent_id ); $result[] = $parent_id; $parent_id = $page_id; } } //配列を逆順に(rootを0に) $result = array_reverse( $result ); //rootがtureの場合0番目(rootページのみ)をセット if( $root == true) { $result = $result[0]; } return $result; }
単純にpost_parentの取得を0になるまで繰り返してやるだけです。
至ってシンプル。
記事IDのみ返すか記事データを返すか、最上位ページのみ返すか親ページ全部返すかオプションで指定できます。
引数の説明です。
- $parent_id
これは必須です。基本$post->post_parentを入れて下さい。 - $object
記事IDのみ返すか記事データを返すかです。デフォルトは記事データです。 - $root
最上位ページのみ返すか親ページ全部返すかです。デフォルトは最上位ページのみです。
使用例
ひ孫ページ(記事ID=213)での結果です。
記事ID,最上位ページのみ
$parent = get_page_parent( $post->post_parent , false ); //結果 207
記事ID,親全部
$parent = get_page_parent( $post->post_parent , false , false ); //結果 Array ( [0] => 207 [1] => 209 [2] => 211 )
記事データ,最上位ページのみ
$parent = get_page_parent( $post->post_parent ); //結果 WP_Post Object ( [ID] => 207 [post_author] => 1 [post_date] => 2016-02-13 00:35:39 [post_date_gmt] => 2016-02-12 15:35:39 [post_content] => [post_title] => 親ページ [post_excerpt] => ... [comment_count] => 0 [filter] => raw )
記事データ,親全部
$parent = get_page_parent( $post->post_parent , true , false ); //結果 Array ( [0] => WP_Post Object ( [ID] => 207 [post_author] => 1 [post_date] => 2016-02-13 00:35:39 [post_date_gmt] => 2016-02-12 15:35:39 [post_content] => [post_title] => 親ページ ... [comment_count] => 0 [filter] => raw ) [1] => WP_Post Object ( [ID] => 209 [post_author] => 1 [post_date] => 2016-02-13 00:35:51 [post_date_gmt] => 2016-02-12 15:35:51 [post_content] => [post_title] => 子ページ ... [comment_count] => 0 [filter] => raw ) [2] => WP_Post Object ( [ID] => 211 [post_author] => 1 [post_date] => 2016-02-13 00:38:24 [post_date_gmt] => 2016-02-12 15:38:24 [post_content] => [post_title] => 孫ページ ... [comment_count] => 0 [filter] => raw ) )
親全部取得した場合も一番最初に最上位ページが来るようになってるので$parent[0]で最上位ページが取れます。
$parent[1],$parent[2]とすることで階層を指定して出力させることも可能。
$post->post_parentに0が入ることもありますので、取得後出力させる場合はifであるかないかの判断をさせて下さい。
$parent = get_page_parent( $post->post_parent , true , false ); if( $parent ) { ~
カテゴリーの親・最上位カテゴリを取得する記事を書きましたのでよろしければどうぞ。