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マスターの回答を待ってくださいね。
ちょっとコードないのですが、考え方だけ。
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階層以上には対応していません。
- 関数名は格好良いのに変えてください。
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階層への対応など)コードなので、判定基準の変化があった時は見直してください。
- 思い通りの挙動だったとしても、冗長であたっり別の簡単な方法があるかもしれないので、しばらく解決済みにせず、他の方のコメントを待ってください。