ページナビ
いわゆるトップページで一覧表示する時や、シングルページで個別記事を表示する時に、ページ下部に「新しい投稿」「過去の投稿」や「次の記事」「前の記事」を表示することをページナビゲーションといいます。いろいろなテンプレートで工夫を凝らして、下部に全ページをボタン表示したり、記事名のリンクにしたりと少しでも利便性を高め、アクセス数を稼ごうと涙ぐましい努力が続けられています。一般的にページナビを充実することはサイト運用者の義務とされているようです。個人的にはほっとけよ、とは思いますがw
現在使用中のテーマでは、get_the_post_navigation()を活用した実装がされています。wp-includes/link-template.phpをのぞいてみると以下のコードが確認できます。
function get_the_post_navigation( $args = array() ) { $args = wp_parse_args( $args, array( 'prev_text' => '%title', 'next_text' => '%title', 'in_same_term' => false, 'excluded_terms' => '', 'taxonomy' => 'category', 'screen_reader_text' => __( 'Post navigation' ), ) ); $navigation = ''; $previous = get_previous_post_link( '<div class="nav-previous">%link</div>', $args['prev_text'], $args['in_same_term'], $args['excluded_terms'], $args['taxonomy'] ); $next = get_next_post_link( '<div class="nav-next">%link</div>', $args['next_text'], $args['in_same_term'], $args['excluded_terms'], $args['taxonomy'] ); // Only add markup if there's somewhere to navigate to. if ( $previous || $next ) { $navigation = _navigation_markup( $previous . $next, 'post-navigation', $args['screen_reader_text'] ); } return $navigation; }
ここで重要なのは、in_same_termパラメータです。ある記事を開いている時に、前後の記事を単純に日付でリンクするか、同一カテゴリー内で前後にリンクするかを制御します。上記コードでわかるように、デフォルトでは「false」設定されているので、そのまま使うと単純に日付で前後にリンクされます。
このサイトのように旅ブログとIT閑話を交互に書いていると、旅ブログの前後がIT閑話では不親切な場合もあります。そのような場合には、in_same_termを「true」で使用します。ただし、テーマのファンクションがパラメータ渡し出来るように継承されている必要はあります。その辺をいじると面倒だしってことで、テーマのファンクションではなく、直接get_the_post_navigation()を呼び出すという禁じ手もあります。
この手を使っても多少の問題はあって、現在のwordpressのバージョンでは、ある記事が属しているカテゴリーが複数あった場合、特定のカテゴリーで前後にリンク出来ません。実際にはカテゴリーに割り当てられているIDが昇順で選ばれるようなので、ユーザーから見るとカテゴリーによってはランダムに選択されているように見えます。そこで少し改善する余地があって、上記コードの中に、「excluded_terms」にリンクから除外するカテゴリーを指定出来るので、ここであらかじめ除外するカテゴリーを指定しておくと、ランダムな選択から、ある程度コントロールされた前後リンクにすることが出来ます。
<?php if ( is_user_logged_in() ) : do_action( 'oblique_single_post_navigation' ); else : $args = wp_parse_args( $args, array( 'prev_text' => '%title', 'next_text' => '%title', 'in_same_term' => true, 'excluded_terms' => '1,5,6,7,8,10', 'taxonomy' => 'category', 'screen_reader_text' => __( 'Post navigation' ), ) ); the_post_navigation($args); endif; ?>
上記コードでは、ログインしている場合には個別記事からの前後リンクは単純な日付で制御されますが、ログインしていない場合には、個別記事が属しているカテゴリーを基準に前後にリンクされ、その際に選択から除外されるカテゴリーが指定されています。