炊きたてのご飯が食べたい

定時に帰れるっていいね。自宅勤務できるっていいね。子どもと炊きたてのご飯が食べられる。アクトインディでは積極的にエンジニアを募集中です。

WordPressのrel="prev"とrel="next"をnextpageで分割した記事のURLに変更する


WordPressでは、自動的にrel="prev"とrel="next"がhead内に記述されますが、nextpageによる記事の区切りではなく、前の記事と次の記事を示すタグとして使用されています。

Google複数ページにまたがる記事の関連性を知るためにprevとnextをサポートしましたが、推奨する使用方法としては、一つの記事の内容を「長くなるから」などの理由で複数ページに分割した際に、記事が連続していることを伝えるために使用します。

WordPressで出力している内容とは意味合いが異なるため、headにデフォルトで挿入されるrel="prev"とrel="next"を削除し、投稿ページ内のnextpageで分割している記事のURLをprevとnextに指定したいと思います。

例) 記事の本文は…

[html]1ページ目 <!--nextpage--> 2ページ目 <!--nextpage--> 3ページ目[/html]

URLは…

  1. http://test.com/archives/test (1ページ目)
  2. http://test.com/archives/test/2 (2ページ目)
  3. http://test.com/archives/test/3 (3ページ目)

http://test.com/archives/test を閲覧したときは…

[html]<link rel="next" href="">http://test.com/article/test/2">[/html]

http://test.com/archives/test/2 を閲覧したときは…

[html]<link rel="prev" href="">http://test.com/article/test"> <link rel="next" href="">http://test.com/article/test/3">[/html]

http://test.com/archives/test/3 を閲覧したときは…

[html]<link rel="prev" href="">http://test.com/article/test/2">[/html]

をそれぞれheadに記述する方法です。

対応方法

●funcrion.phpに追加

[php]//rel next,prevの対応 remove_action('wp_head','adjacent_posts_rel_link_wp_head',10);[/php]

●header.phpのhead内に追加

[php]<?php if( is_single() ) : ?> <?php $pages = count( explode('<!--nextpage-->', $post->post_content) ) ; ?> <?php if ( $pages > 1 ) : ?> <?php if ( $page == $pages ) : // 最後のページ ?> <?php if ( $page == 2 ) : ?> <link rel="prev" href="<?php the_permalink(); ?>"> <?php else : ?> <link rel="prev" href="<?php the_permalink(); ?>/<?php echo $page - 1; ?>"> <?php endif; ?> <?php else : ?> <?php if ( $page == 0 ) : // 1ページ目 ?> <link rel="next" href="<?php the_permalink(); ?>/<?php echo $page + 2; ?>"> <?php else : ?> <?php if ( $page == 2 ) : ?> <link rel="prev" href="<?php the_permalink(); ?>"> <?php else : ?> <link rel="prev" href="<?php the_permalink(); ?>/<?php echo $page - 1; ?>"> <?php endif; ?> <link rel="next" href="<?php the_permalink(); ?>/<?php echo $page + 1; ?>"> <?php endif; ?> <?php endif; ?> <?php endif; ?> <?php endif; ?>[/php]

※最初は閲覧中の投稿ページが複数ページで構成されているかを$numpagesで判別しようと思ったのですが、投稿ページのループ内でしか値を取得することができず、explodeでnextpageを区切り文字として値をカウントする方法を取りました。 ●loop-single.php [php]<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?> <?php global $numpages; echo $numpages; ?>[/php] の出力結果では$numpagesに値が返却されますが、 [php]<?php global $numpages; echo $numpages; ?> <?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>[/php] では値がnullとなります。