[WordPress] 子ページに前後ページへのリンクを設ける

WordPressの「固定ページ」に子ページを複数登録して、
親ページには子ページリストを設けて、そこから子ページにリンクするようにし、
子ページ上では、前後の子ページと親ページにリンクさせるナビを設けたい。

「投稿」の場合で、previous_post_link() や next_post_link() の引数 $in_same_term を true にするような場合があるけど、
それと似たような感じの子ページ用ページ送りナビを作ってみた。

みんなどうしてるのかな?と思って調べてみたら、SQL文を書いている方もおられたようだけど、僕はごく普通にテンプレートタグ等で書いてみた。

<?php
/*
 * 子ページ(現在ページ)のID と 親ページのID
 */
$page_id = $post->ID;
$parent_id = $post->post_parent;
?>

<?php if( $parent_id ) : // 親ページが存在する場合(つまり子ページ)だけ処理を有効にする ?>

<?php
/*
 * 子ページ一式の取得
 */
$the_query = new WP_Query( array(
    'post_type' => 'works', // この場合は works というカスタム投稿タイプ。通常は page でいけるはず。
    'post_parent' => $parent_id,
    'orderby' => 'menu_order',
    'order' => 'ASC'
) );
if( $the_query->have_posts() ) {
    $child_page_links = []; // 子ページのアンカータグを格納する配列
    $cnt = -1;
    while ( $the_query->have_posts() ) {
        $cnt++;
        $the_query->the_post();
        $link = '<a href="' . get_the_permalink() . '">' . get_the_title() . '</a>';
        $child_page_links[] = $link; // アンカータグを配列に格納

        if( $page_id == get_the_ID() ) {
	    $current_index = $cnt; // 現在ページが配列の何番のインデックスに相当するか
        }
    }
    /*
     * 子ページが1つだけ(それ自身)の場合
     */
    if( count( $child_page_links ) == 1 ) {
        $prev = '';
        $next = '';
    }
    /*
     * 最初の子ページの場合の前後リンクタグ
     */
    elseif( $current_index == 0 ) {
        $prev = '';
        $next = $child_page_links[$current_index + 1] . ' &raquo;';
    }
    /*
     * 最後の子ページの場合の前後リンクタグ
     */
    elseif( $current_index == count( $child_page_links ) - 1 ) {
        $prev = '&laquo; ' . $child_page_links[$current_index - 1];
        $next = '';
    }
    /*
     * 途中の子ページの場合の前後リンクタグ
     */
    else {
        $prev = '&laquo; ' . $child_page_links[$current_index - 1];
        $next = $child_page_links[$current_index + 1] . '&raquo;';
    }
}
wp_reset_postdata();
?>

<!-- 前後リンクの出力 -->
<p class="pagenav cf">
    <span class="prev"><?php echo $prev; ?></span>
    <span class="next"><?php echo $next; ?></span>
    <span class="top"><a href="<?php the_permalink( $parent_id ); ?>">トップ</a></span>
</p>

<?php endif; ?>

コメントを残す

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