5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

親ページと子ページを判別するための条件分岐タグ

Last updated at Posted at 2017-12-21

2018/01/12改訂しました

#はじめに
固定ページの判別やアーカイブページの判別等できる条件分岐タグはあれど、このページを親にもってるよ!とかこのページを子ページに持ってるよ!みたいな判別ができたり、単純に親ページの有無・子ページの有無を判別できる感じのタグがなかったので、作ってみました。

##目指した形

  • is_page()
  • is_page("slug")
  • is_page("title")
  • is_page("ID")
    以上の固定ページの条件分岐タグと同様に動くようにしたい!
    ※複数指定はまだ考えられていないです。

ここおかしいのでは!?!?みたいなのがあればお知らせいただけると嬉しいです◎

##改訂しました!
2018/01/12
おかしなところがあったので、修正しました!
あと、下記のような複数ページの指定

例(固定ページの判別)
<?php if(is_page(array("page1","page2")));?>
//現在のページがpage1,page2のいずれかのときの処理
<?php endif;?>

にも対応しました。

#親ページの条件分岐タグ
##作り方
以下をテーマフォルダのfunctions.php内にコピペします。
※下手をするとサイトがエラーで表示できなくなるのでバックアップをとってくださいね……!

###初稿

is_child()
function is_child( $slug = "" ) {
  global $post;
  if ( $post->post_parent ) {//現在の投稿に親ページがあるとき
    $post_data = get_post($post->post_parent);//親ページ情報を取得
    if($slug != "") {//$slugが空じゃないとき
      if($slug == $post_data->post_name || $slug == $post_data->ID || $slug == $post_data->post_title) {//$slugが親ページのslugまたはIDまたはタイトルに一致するとき
        return true;
      } else {
        return false;
      }
    } else {//$slugが空の時(親ページは存在)
      return true;
    }
  }else {//親ページがない時
    return false;
  }
  wp_reset_postdata();//リセットは必要なのか…??
}

###改訂版(2018/01/12|不具合修正、配列対応)

//親ページ判別
function is_child( $slug = "" ) {
  if(is_singular())://投稿ページのとき固定ページ含
    global $post;
    if ( $post->post_parent ) {//現在のページに親がいる場合
      $post_data = get_post($post->post_parent);//親ページの取得
      if($slug != "") {//$slugが空じゃないとき
        if(is_array($slug)) {//$slugが配列のとき
          for($i = 0 ; $i <= count($slug); $i++) {
            if($slug[$i] == $post_data->post_name || $slug[$i] == $post_data->ID || $slug[$i] == $post_data->post_title) {//$slugの中のどれかが親ページのスラッグ、ID、投稿タイトルと同じのとき
              return true;
            }
          }
        } elseif($slug == $post_data->post_name || $slug == $post_data->ID || $slug == $post_data->post_title) {//$slugが配列ではなく、$slugが親ページのスラッグ、ID、投稿タイトルと同じのとき
          return true;
        } else {
          return false;
        }
      } else {//親ページは存在するけど$slugが空のとき
        return true;
      }
    }else {//親ページがいない
      return false;
    }
  endif;
}

##使い方

is_child()の使い方
<?php if(is_child()):?>
//親ページを持つ(今のページが子ページの時の処理)
<?php else:?>
//親ページではないときの処理
<?php endif;?>

<?php if(is_child("parent")):?>
//スラッグ"parent"のページを親に持つページのとき
<?php else:?>
//それ以外の処理
<?php endif;?>

#子ページの条件分岐タグ
##作り方
同様に以下をテーマフォルダのfunctions.php内にコピペします。
※下手をするとサイトがエラーで表示できなくなるのでバックアップをとってくださいね……!

###初稿

is_parent()
function is_parent( $myslug = "" ) {
  global $post;
  $args = array(
            "post_type" => $post->post_type,
            "nopaging" => true
          );
  $myPosts = get_posts($args);
  if ( get_page_children($post->ID,$myPosts) ) {//$myPostsの中に現在のページの子ページがあったとき
    $child_pages = get_page_children($post->ID,$myPosts);//$myPostsの中の現在のページの子ページリスト取得
    if($myslug != "") {//$myslugが空じゃないとき
      for($i = 0 ; $i <= count($child_pages); $i++) {//子ページの数だけ処理を繰り返す
        if($myslug == $child_pages[$i]->post_name || $myslug == $child_pages[$i]->ID || $myslug == $child_pages[$i]->post_title) {//$myslugが子ページのslugまたはIDまたはタイトルに一致するとき
          return true;//trueが返るとループから解脱します
        }
      }
      wp_reset_postdata();//get_posts()のリセット←使用してみて不具合は見られないけど位置がおかしいかもしれない
    } else {//$myslugが空の時(子ページは存在)
      return true;
    } 
  } else {//子ページがなかった時
    return false;
  }
}

###改訂版(2018/01/12|不具合修正、配列対応)

//子ページ判別
function is_parent( $myslug = "" ) {
  if(is_singular())://投稿ページのとき固定ページ含
    global $post;
    $args = array(
              "post_type" => $post->post_type,
              "nopaging" => true
            );
    $myPosts = get_posts($args);//現在のページと同じ投稿タイプのページを取得
    if ( get_page_children(get_the_ID(),$myPosts) ) {//$myPostsの中に現在のページの子ページがいるとき
      $child_pages = get_page_children(get_the_ID(),$myPosts);//子ページを固定ページオブジェクトのリストで取得
      if($myslug != "") {//$myslugが空じゃないとき
        if(is_array($myslug)) {//$myslugが配列のとき
          for($i = 0 ; $i <= count($myslug); $i++) {//$myslugの配列の個数分、処理を繰り返し
            for($j = 0 ; $j <= count($child_pages); $j++) {//$child_pagesの個数分、繰り返し
              if($myslug[$i] == $child_pages[$j]->post_name || $myslug[$i] == $child_pages[$j]->ID || $myslug[$i] == $child_pages[$j]->post_title) {//$myslugの配列の中身のどれかが、子ページのどれかのスラッグ、ID、投稿タイトルと一致する場合
                return true;
              }
            }
          }
        } else {//$myslugが配列じゃないとき
          for($i = 0 ; $i <= count($child_pages); $i++) {//$child_pagesの個数分、繰り返し
            if($myslug == $child_pages[$i]->post_name || $myslug == $child_pages[$i]->ID || $myslug == $child_pages[$i]->post_title) {//$myslugのが、子ページのどれかのスラッグ、ID、投稿タイトルと一致する場合
              return true;
            }
          }
        }
        wp_reset_postdata();
      } else {//$myslugが空で、現在のページが子ページを持つとき
        return true;
      } 
    } else {//子ページを持たないとき
      return false;
    }
  endif;
}

##使い方

is_parent()の使い方
<?php if(is_parent()):?>
//子ページを持つ(今のページが親ページの時の処理)
<?php else:?>
//子ページではないときの処理
<?php endif;?>

<?php if(is_parent("child")):?>
//スラッグ"child"のページを子に持つページのとき
<?php else:?>
//それ以外の処理
<?php endif;?>

###まとめ
こんなかんじで、親ページ子ページの判別のための条件分岐タグが使えるようになりました!
構造がシンプルなサイトだとそこまで使いどころがないですが、複雑化したサイトを作る場合には役立つと思います!

何か間違っている部分等ございましたら、ご指摘いただければ幸いです。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?