現在表示中の固定ページの子ページを取得したい

サイト構築をしていて、固定ページの中にその固定ページの子ページの一覧を表示したく調べてみた。WordPressには、get_childrenという関数が準備されているので、これを使用して一覧が出力できそう。さっそく固定ページ内に次のように記述。

if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        $args = array(
            'post_parent' => get_the_ID(),
            'post_status' => 'publish',
            'post_type'   => 'page'
        );
        $children_array = get_children( $args );

        if ( count( $children_array ) > 0 ) {
            echo '<ul>';
            foreach ( $children_array as $child ) {
                $url = get_permalink( $child->ID );

                $html  = '<li>';
                $html .= '<a href="' . esc_url( $url ) . '">';
                $html .= esc_html( $child->post_title );
                $html .= '</a>';
                $html .= '</li>';

                echo $html;
            }
            echo '</ul>';
        }
    endwhile;
endif;

処理の流れは以下の通り。

  1. 4行目・・・連想配列post_parentに親(現在のページ)ページの値をセット
  2. 5行目・・・連想配列post_statusにpublish(公開記事)をセット
  3. 6行目・・・連想配列post_typeにpage(固定ページ)をセット
  4. 8行目・・・セットした連想配列を引数にget_children関数をコール

あとは、子ページが存在すれば戻り値がオブジェクトで返ってきます。初期値はオブジェクトですが、get_children関数の第二引数に定数「ARRAY_A」を渡せば連想配列、定数「ARRAY_N」を渡せばインデックス配列で返ってきます。

13行目で、get_permalink関数をコールしているのは、子ページのリンクを取得したかったのですが、どうやらパーマリンクは戻り値にないようなのでIDを渡して取得しています。これでOK。

子ページの並び替え(ソート)をしたい

出力はできたのですが、並び順が……デフォルトでは、投稿日時の降順になるようです。これを固定ページの属性設定にある「順序」項目の数字の小さい順にソートをかけたい。

固定ページの属性「順序」

get_children関数のマニュアルにはないので、「本当にできないの?」と思い、コアファイル眺めていたらできるじゃないか。get_children関数の中でget_posts関数にget_children関数の引数(連想配列)渡している。ということは、get_posts関数の引数に渡せる配列は、同じように使える!ということで、連想配列に「order(降順:DESC・昇順:ASC)」「orderby(フィールド名)」をセットしてあげればいけるはず。

if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        $args = array(
            'post_parent' => get_the_ID(),
            'post_status' => 'publish',
            'post_type'   => 'page',
            'order'       => 'ASC',
            'orderby'     => 'menu_order'
        );
        $children_array = get_children( $args );

        if ( count( $children_array ) > 0 ) {
            echo '<ul>';
            foreach ( $children_array as $child ) {
                $url = get_permalink( $child->ID );

                $html  = '<li>';
                $html .= '<a href="' . esc_url( $url ) . '">';
                $html .= esc_html( $child->post_title );
                $html .= '</a>';
                $html .= '</li>';

                echo $html;
            }
            echo '</ul>';
        }
    endwhile;
endif;

できた!\(^o^)/
追加したのは、7行目と8行目。orderにはASC(昇順)、orderbyにはmenu_order(固定ページ属性の順序の値が保存されているフィールド)を指定しました。出力する件数や除外するページなんかも同じようにget_posts関数の連想配列にあわせて指定してあげればいけそうですね。