WordPressで個別記事のカテゴリ別ページ送りができない! ~テーマ別パターンを掲載(Simplicity、Luxeritas)

この記事は約12分で読めます。

Luxeritas, WordPressカスタマイズ

質問者の写真

小説のページのはずなのに、次ページのナビが昨日食べたイチゴ大福の記事になっちゃってるよ~

解答者の写真
美味しかった? 

 

質問者の写真

違うからっ! ちゃんと次も小説ページをナビしたいの!
 

(※本記事は以前に書いた記事を大幅に改訂したものです)

カテゴリ別の個別記事ページ遷移

この問題、ハマっている方は多いと思います。
以前の私もそうでした。
なんせ、ここは小説サイト。
連載物を掲載するときは、同一カテゴリ(同じ小説)でページ送りできないと致命的ですから。
(完結していればnextpageで分割する手法もありますが)

一方で、テーマをカスタマイズしないと多くのテーマで上の会話みたいになります。
つまり、デフォルト。
私やツインテールっ子の望み通りにしたいなら、テーマをカスタマイズする必要があります。

厄介なのはテーマによってページ送りの実装コードが違うこと。

そのため、以下では例としてSimplicityLuxeritasについて記します。
この手の問題でハマっている方、大抵はどちらかで片付くのではないかと思います。

Simplicityの場合

Simplicityのサムネイルページ送りテンプレートはpager-post-navi-thumbnail.php
1行目から数行記します。

<div class="navigation">
<div id="prev-next" class="clearfix">
<?php
$prevpost = get_adjacent_post(false, '', true); //前の記事
$nextpost = get_adjacent_post(false, '', false); //次の記事
if( $prevpost or $nextpost ){ //前の記事、次の記事いずれか存在しているとき
?>

4~5行目のget_adjacent_post();のパラメーターを次の通りに修正します。

$prevpost = get_adjacent_post(true, '', true); //前の記事
$nextpost = get_adjacent_post(true, '', false); //次の記事

検索して見かけるページ送りのパターンの多くは、大体これに当てはまる気がします。

Luxeritasの場合

Simplicityと違って、ちょっと厄介です。

Luxeritasのページ送りは投稿テンプレート(single.php)に直書きされています。
この部分。

<?php
if( isset( $luxe['next_prev_nav_visible'] ) ) {
?>
<div id="pnavi" class="grid">
<?php 
 $next_post = get_next_post();
 if( $next_post ) {
 $next_thumb = get_the_post_thumbnail($next_post->ID, 'thumb100');
 if( empty( $next_thumb ) ) $next_thumb = '<div class="no-img-next"><i class="fa fa fa-file-text"></i></div>';
?>
<div class="next"><?php next_post_link( '%link', $next_thumb . '<div class="ntitle">' . $next_post->post_title . '</div><div class="next-arrow"><i class="fa fa-arrow-right pull-right"></i>Next</div>' ); ?></div>
<?php
 }
 else {
?>
<div class="next"><a href="<?php echo THK_HOME_URL; ?>"><i class="fa fa-home navi-home"></i><div class="next-arrow"><i class="fa fa-arrow-right pull-right"></i>Home</div></a></div>
<?php
 }
 $prev_post = get_previous_post();
 if( $prev_post ) {
 $prev_thumb = get_the_post_thumbnail($prev_post->ID, 'thumb100');
 if( empty( $prev_thumb ) ) $prev_thumb = '<div class="no-img-prev"><i class="fa fa fa-file-text fa-rotate-180"></i></div>';
?>
<div class="prev"><?php previous_post_link( '%link', $prev_thumb . '<div class="ptitle">' . $prev_post->post_title . '</div><div class="prev-arrow"><i class="fa fa-arrow-left pull-left"></i>Prev</div>' ); ?></div>
<?php
 }
 else {
?>
<div class="prev"><a href="<?php echo THK_HOME_URL; ?>"><i class="fa fa-home navi-home"></i><div class="prev-arrow"><i class="fa fa-arrow-left pull-right"></i>Home</div></a></div>
<?php
 }
?>
</div><!--/.pnavi-->

「次のページ」(next)のループ部分。

<?php 
 $next_post = get_next_post();
 if( $next_post ) {
 $next_thumb = get_the_post_thumbnail($next_post->ID, 'thumb100');
 if( empty( $next_thumb ) ) $next_thumb = '<div class="no-img-next"><i class="fa fa fa-file-text"></i></div>';
?>

get_next_post();$in_same_termの値を指定します。

$next_post = get_next_post($in_same_term = true);
$in_same_termはカテゴリを判断するパラメータ。
デフォルトはfalse。trueだと同じカテゴリになります。

「次のページ」(next)の表示部分

<div class="next"><?php next_post_link( '%link', $next_thumb . '<div class="ntitle">' . $next_post->post_title . '</div><div class="next-arrow"><i class="fa fa-arrow-right pull-right"></i>Next</div>' ); ?></div>

ここも要領は同じ。

<div class="next"><?php next_post_link( '%link', $next_thumb . '<div class="ntitle">' . $next_post->post_title . '</div><div class="next-arrow"><i class="fa fa-arrow-right pull-right"></i>Next</div>', true ); ?></div>

長くてよくわからないかもですが、next_post_link();のパラメーターはリンク・サムネイル・タイトル・矢印の並び。
一番最後に「true」を入れてあげれば、先程の「$in_same_term = true」と同じになります。
省略しているのは、他にもタクソノミーなどによる分類があるのですが、デフォルトはカテゴリ。
何も書かなければ「true」だけで「$in_same_term=true」と同じだからです。

ここまでがnext(右側)、prev(左側)も同じようにやります。
prevは修正後のみ掲載します。

「前のページ」(prev)のループ部分

<?php
 }
 $prev_post = get_previous_post($in_same_term = true);
 if( $prev_post ) {
 $prev_thumb = get_the_post_thumbnail($prev_post->ID, 'thumb100');
 if( empty( $prev_thumb ) ) $prev_thumb = '<div class="no-img-prev"><i class="fa fa fa-file-text fa-rotate-180"></i></div>';
?>

「前のページ」(prev)の表示部分

<div class="prev"><?php previous_post_link( '%link', $prev_thumb . '<div class="ptitle">' . $prev_post->post_title . '</div><div class="prev-arrow"><i class="fa fa-arrow-left pull-left"></i>Prev</div>', true ); ?></div>

以上で完成です。

そっくり差し替える場合は、こちらをどうぞ。

<?php
if( isset( $luxe['next_prev_nav_visible'] ) ) {
?>
<div id="pnavi" class="grid">
<?php 
 $next_post = get_next_post($in_same_term = true);
 if( $next_post ) {
 $next_thumb = get_the_post_thumbnail($next_post->ID, 'thumb100');
 if( empty( $next_thumb ) ) $next_thumb = '<div class="no-img-next"><i class="fa fa fa-file-text"></i></div>';
?>
<div class="next"><?php next_post_link( '%link', $next_thumb . '<div class="ntitle">' . $next_post->post_title . '</div><div class="next-arrow"><i class="fa fa-arrow-right pull-right"></i>Next</div>', true ); ?></div>
<?php
 }
 else {
?>
<div class="next"><a href="<?php echo THK_HOME_URL; ?>"><i class="fa fa-home navi-home"></i><div class="next-arrow"><i class="fa fa-arrow-right pull-right"></i>Home</div></a></div>
<?php
 }
 $prev_post = get_previous_post($in_same_term = true);
 if( $prev_post ) {
 $prev_thumb = get_the_post_thumbnail($prev_post->ID, 'thumb100');
 if( empty( $prev_thumb ) ) $prev_thumb = '<div class="no-img-prev"><i class="fa fa fa-file-text fa-rotate-180"></i></div>';
?>
<div class="prev"><?php previous_post_link( '%link', $prev_thumb . '<div class="ptitle">' . $prev_post->post_title . '</div><div class="prev-arrow"><i class="fa fa-arrow-left pull-left"></i>Prev</div>', true ); ?></div>
<?php
 }
 else {
?>
<div class="prev"><a href="<?php echo THK_HOME_URL; ?>"><i class="fa fa-home navi-home"></i><div class="prev-arrow"><i class="fa fa-arrow-left pull-right"></i>Home</div></a></div>
<?php
 }
?>
</div><!--/.pnavi-->

結論

解答者の写真

恐らく、どちらかのテーマのパターンには当てはまるんじゃないかな?
要は「true」と「false」を、どこにどのように入れるかってだけ。
これで立派な小説サイトが作れるわね!

おまけ

レアケースですが、記述を変更しても動かない場合があります。
原因はプラグインの相性だったり、WordPressそのものがおかしくなってたり。

実は以前の私がそう。
「関数は合ってるはずなのに!」と半ば発狂。
結局、WordPressを再インストールしたら解決しました……。

おまけの結論

解答者の写真

どうしてもダメだと思ったら、思い切ってWordPressの再インストールするのも一つの手よ