Secura Vita

Category: Works , WordPress
Works

wordpress:固定ページで親ページ、最上位ページを取得する

wordpress:固定ページで親ページ、最上位ページを取得する

wordpressの固定ページでは親子階層を作ることが可能です。
ブログ程度では余り使わないですが、コーポレートサイトになると出番が結構あったり。

なので親ページ・最上位ページを取得する方法を書いてみました。よろしければ御覧ください。

2016/02/16追記:
wordpressにはget_post_ancestorsなる関数がありました…orz

基本やってることは一緒ですが、ちょっとだけ違うのでこのまま掲載しておきます。

1つ上の親を取得

単純に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 ) {
~

カテゴリーの親・最上位カテゴリを取得する記事を書きましたのでよろしければどうぞ。


おもしろかった・役に立った
▼ブログランキング参加中!クリック!▼
  • ブログランキング・にほんブログ村へ

Leave a comment

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

ソースコードを記入する場合は [code]~[/code] でくくってください。
[code]
echo "Hello World";
[/code]

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください