#なにがしたいか
##よくあるやつ
「お知らせ」の記事詳細ページの"前の記事へ"、"次の記事へ"をクリックすると、
「お知らせ」カテゴリの前の記事、次の記事が出てくる
##違う、そうじゃない
「お知らせ」一覧から見たときにそうなってるのは分かるけど、
「すべての記事」一覧から見たときにもそうなることがある
#やること
- カテゴリー一覧開いたら「今どのカテゴリ一覧から遷移しているか」をセッションに追加
すでにセッションで「今どのカテゴリ一覧から遷移しているか」を持っていても
カテゴリー一覧にいる限りは常に更新
- 記事詳細ページ開いたときに「カテゴリ一覧から遷移してきたか」を確認
カテゴリ一覧からじゃなかったら公開されてる前後の記事出せばいいだけ
- カテゴリ一覧から遷移してきていたら見ていたカテゴリの記事を表示
これがやりたい
なので、複数カテゴリーが登録されている記事でも特定のカテゴリに絞れるよ!
#サンプルコード
header.php
disp_category();
// HTMLタグの前(最初のPHPタグの中)に記述すること
functions.php
function disp_category() {
session_start();
if (is_category()) {
$_SESSION['cat'] = get_queried_object()->term_id;
} elseif (!is_single()) {
session_destroy();
}
}
single.php
// 記事のタイトル部とか本文部とか省略
// カテゴリによって前後の取得記事を変える
$args = array(
'posts_per_page' => -1,
'offset' => 0,
'orderby' => 'date',
'order' => 'DESC',
'post_type' => 'post',
'post_status' => 'publish',
'suppress_filters' => false,
);
// セッションにカテゴリがある場合、そのカテゴリの記事を取得
if ($_SESSION['cat'] !== null) {
$args['cat'] = $_SESSION['cat'];
}
$posts_array = get_posts( $args );
$plural_flg = (count($posts_array) > 1) ? true : false;
$post_detail = array();
foreach ($posts_array as $key => $value) {
//配列から現在の記事情報を参照
if (get_the_ID() == $value->ID && $plural_flg) {
if ($key == 0) {
//最初の記事
$post_detail['pre']['id'] = $posts_array[$key+1]->ID;
} else if($key + 1 >= count($posts_array)){
//最後の記事
$post_detail['next']['id'] = $posts_array[$key-1]->ID;
} else {
//通常の記事
$post_detail['pre']['id'] = $posts_array[$key+1]->ID;
$post_detail['next']['id'] = $posts_array[$key-1]->ID;
}
break;
}
}
?>
<!-- 前後の記事へ -->
<?php if (count($post_detail) > 0) { ?>
<div>
<?php if (isset($post_detail['pre'])) { ?>
<a href="<?php the_permalink($post_detail['pre']['id']); ?>" rel="prev"><p>前の記事へ</p></a>
<?php } ?>
<?php if (isset($post_detail['next'])) { ?>
<a href="<?php the_permalink($post_detail['next']['id']); ?>" rel="next"><p>次の記事へ</p></a>
<?php } ?>
</div>
<?php } ?>
<!-- 前後の記事へ -->
のところはdivタグで囲ってたりpタグ使ってたりしますがそのへんはご自由に
#いろいろ
##利点
- カテゴリーを取得してくるので、パンくずにどのカテゴリー一覧から来たか出したいときにそのまま出せる
##問題点
- 前後の記事を探すのに
'posts_per_page' => -1,
を使っているので、記事数が多くなるとブラウザがお亡くなりになる。