サポート » 使い方全般 » 固定ページの現在いる階層別の記事

  • 固定ページで、現在いる階層によって、
    以下のように第三階層にサブページがある固定ページとその第三階層目のページでのみ
    記事一覧表示を変えたいのですが、
    どのような方法があるのでしょうか?

    ———-

    <固定ページの構成>
    固定ページA
    └固定ページA1
    └固定ページA2
     └固定ページA2-1
     └固定ページA2-2
     └固定ページA2-3

    ———-

    <固定ページA/固定ページA1の表示>
    固定ページA
    └固定ページA1
    └固定ページA2

    ———-

    <固定ページA2/固定ページA2-1の表示>
    固定ページA
    └固定ページA1
    └固定ページA2
     └固定ページA2-1

    ———-

    is_subpage を利用して条件分岐で、出来ないか考えてみましたが、
    2階層目以降が同じ表示になってしまいます。。。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • php の関数 explode() でURL を ‘/’ で分割することができます。

    <?php
    // 例えば、 http://example.jp/A/A1/ というURL のページにいる場合
    $segurl = explode('/', $_SERVER['REQUEST_URI']);
    /*
    $exurl の中身(配列)
    Array
    (
    	[0] =>
    	[1] => A
    	[2] => A1
    	[3] =>      // 末尾のスラッシュを省いたURL設定の場合ここには値がセットされない
    )
    */
    // サブページの判定
    if ( !empty($segurl[2]) ) {
    }
    // サブページかつ第三階層目の判定
    if ( !empty($segurl[3]) ) {
    }
    ?>

    URL の最後にスラッシュを付けているか否かで結果が若干違ってくるので、対象ページで、
    print_r(explode('/', $_SERVER['REQUEST_URI']));
    として返り値を確認し、nobugot さんの環境に合わせて条件分岐を調整する必要があるかもしれません。

    *もっと簡単な方法があるかも… 他のWPマスターの回答を待ってくださいね。

    モデレーター gatespace

    (@gatespace)

    ちょっとコードないのですが、考え方だけ。
    URLからexplodeするよりは、固定ページのスラッグを取得してからexplodeした方が良いかも。
    (必ずしもルートディレクトリで運用しているとは限らない場合の対策)

    親「example」子「a」の場合、子のスラッグは「example/a」になります

    is_subpage を利用して条件分岐

    codex に載っているサンプルコードのような形でチェックしたい場合は、親ページがあったらその親ページがあるかチェックする、という作業を追加すればいいと思います。

    functions.php へ

    function is_nobugot_special_subpage_checke() {
    	global $post;
    	// 親ページをもっているかチェック
    	if ( !is_page() || !$post->post_parent )
    		return false;
    
    	// 親ページが親ページをもっているかチェック
    	$parent = get_post( $parent_id = $post->post_parent );
    	if ( $parent->post_parent )
    		return 3; // 持っている(第3階層:孫ページ)
    	else
    		return 2; // 持っていない(第2階層:子ページ)
    };

    条件分岐

    if ( is_nobugot_special_subpage_checke() ) {
    	// 子ページ及び孫ページ
    }
    
    if ( 2 == is_nobugot_special_subpage_checke() ) {
    	// 子(第2階層)ページ
    }
    
    if ( 3 == is_nobugot_special_subpage_checke() ) {
    	// 孫(第3階層)ページ
    }
    • get_post を使うのでデータベースへの問い合わせが行われる分、わずかながらコスト増(負荷)が考えられます。(気にする程でもないですが)
    • 第4階層以上には対応していません。
    • 関数名は格好良いのに変えてください。
    トピック投稿者 nobugot

    (@nobugot)

    LVP8 様

    ありがとうございます!
    第3階層のページにだけ、第3階層の記事一覧ができました!

    固定ページA2★(第3階層目のサブページを持っている場合)にも
    第3階層の記事一覧を表示したいのですが、

    固定ページA
    └固定ページA1
    └固定ページA2★
     └固定ページA2-1

    「現在のページが親ページと子ページを持っている」
    という条件式を追加すると良いのでしょうか?

    固定ページA2★(第3階層目のサブページを持っている場合)にも
    第3階層の記事一覧を表示したい

    おー、質問をよく読んでいませんでした…。

    functions.php へ

    function subpage_checke() {
    	global $post, $wpdb;
    	// 親ページを持っているかチェック
    	if ( !is_page() || !$post->post_parent )
    		return false;
    
    	// 第3階層のチェック(親ページが親ページを持っているか)
    	$parent = $wpdb->get_var($wpdb->prepare("
    		SELECT post_parent
    		FROM $wpdb->posts
    		WHERE ID = %d", $post->post_parent
    	));
    	if ( $parent )
    		return 3;
    
    	// 第2階層の場合は子ページを持っているかチェック
    	$child = $wpdb->get_var($wpdb->prepare("
    		SELECT ID
    		FROM $wpdb->posts
    		WHERE post_parent = %d", $post->ID
    	));
    	if ( $child )
    		return 2;
    
    	return false;
    };

    条件分岐

    // 第2階層で子ページ有り、または第3階層
    if ( subpage_checke() ) // ← nobugot さんの要望はこれかと
    
    /* 以下、念のため */
    // 第2階層で子ページ有り
    if ( 2 == subpage_checke() )
    
    // 第3階層ページ
    if ( 3 == subpage_checke() )
    • 応用の効かない(第4階層への対応など)コードなので、判定基準の変化があった時は見直してください。
    • 思い通りの挙動だったとしても、冗長であたっり別の簡単な方法があるかもしれないので、しばらく解決済みにせず、他の方のコメントを待ってください。
5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「固定ページの現在いる階層別の記事」には新たに返信することはできません。