WordPressでrel=”prev/next”をカテゴリなどにも実装する

WordPressでlinkタグrel=prev/nextをカスタマイズするときのアレンジ例と、それぞれのサンプルコードです。

WordPressでrel=”prev/next”をカテゴリなどにも実装する

WordPressではヘッダ情報に <link rel=”prev”> <link rel=”next”> が出力されます。しかし、デフォルトだと投稿のみに限られますね。

これは現在ページと関連の深い前後ページを示すタグなので、アーカイブページに使ったらサーチエンジンがサイト構成を正しく認識してくれそうです。

そんなわけで、アーカイブなど個別投稿記事以外のページを相互に繋ぐように設定してみました。

rel=’prev’ rel=’next’ とは

link タグの rel 属性 (rel=’prev’ rel=’next’) とは、分割テキストの関連性を定義するために使われるヘッダ情報です。現在地の外部リソースに対してリンクを張り合うことで、Googleといったサーチエンジンがまとまったコンテンツとして扱ってくれることを期待します。

標準的な書式は以下の通り。

<link rel=”prev” href=”http://前のページのURL” />
<link rel=”next” href=”http://次のページのURL” />

相対URLでも問題ないのですが、絶対URLで書かれることが多いです。

WordPressでlinkタグに関する初期設定

WordPressの初期設定では、個別記事において前後記事にlinkタグが付与されます。

専門性の高いサイトや創作小説、日記など前後関係が重要なサイトの場合は良いのですが、雑多サイトで前後記事にリンク張ってもあんまり意味がない気がします。

…というか、むしろSEO上の逆効果と見なしてlinkタグを出力するためのフィルタを切ってるサイトをよく見ます。

投稿ページの rel link を削除する

linkタグを改造する前に、まず初期設定である「投稿ページに対するlinkタグ」の停止方法をご紹介しておきます。

linkタグを停止するには’adjacent_posts_rel_link_wp_head’という関数を切ってしまえば表示されなくなります。

【functions.php】
remove_action( 'wp_head','adjacent_posts_rel_link_wp_head', 10, 0 );

テーマフォルダの functions.php に上のコードを記述します。投稿ページのソースに <link rel=’prev/next’> が出力されなくなったことをご確認下さい。

タグを改造するには、まず初期設定のlinkタグを停止する必要があるからです。

投稿ページの link タグを同一カテゴリ内で繋ぐ方法

サイト内の記事のうち、全体ではなく同一カテゴリ内で内部リンクを繋ぐことも出来ます。

ちなみに、同一カテゴリの前後記事を繋ぎたいときは前章のフィルタを切る必要はありません。下のコードによって初期動作が上書きされます。

【function.php】
function ozLinkRelPrevNext() {
  if( is_single() ){
    echo get_adjacent_post_rel_link( $title = '%title', $in_same_term = true, $excluded_terms = '', $previous = true, $taxonomy = 'category' );
    echo get_adjacent_post_rel_link( $title = '%title', $in_same_term = true, $excluded_terms = '', $previous = false, $taxonomy = 'category' );
  }
}
add_action('wp_head', 'ozLinkRelPrevNext');

function.php ではなく、 header.php など実行テンプレートファイルに直接書いても構いません。

【header.php】
if( is_single() ){
  echo get_adjacent_post_rel_link( $title = '%title', $in_same_term = true, $excluded_terms = '', $previous = true, $taxonomy = 'category' );
  echo get_adjacent_post_rel_link( $title = '%title', $in_same_term = true, $excluded_terms = '', $previous = false, $taxonomy = 'category' );
}

get_adjacent_post_rel_link – Codex

【 関連記事 】

previous / next_post_linkで同カテゴリ記事にリンクする

SEO対策ではなく、人間向けに同カテゴリの前後記事にリンクを張りたいときはこちらをどうぞ。

アーカイブページに rel=’prev/next’ を設定する

…というわけで本題です!(・∀・)

カテゴリアーカイブやタグアーカイブなどが複数ページに分割されているとき、ページ同士を繋げて各カテゴリページの関連性を明らかにします。

この場合は最初にご紹介した初期設定フィルタを切っておいて下さい。

アーカイブページのみに設定する

【functions.php】
function ozLinkRelPrevNext(){
  global $paged;
  if( is_archive() ) {
    if ( get_previous_posts_link() ) {
      echo "<link rel='prev' href=".get_pagenum_link( $paged-1 )." />"."\n";
    }
    if ( get_next_posts_link() ) {
      echo "<link rel='next' href=".get_pagenum_link( $paged+1 )." />"."\n";
    }
  }
}
add_action('wp_head', 'ozLinkRelPrevNext');

WordPressの前後ページ設定は癖があるので難しいかったらイヤだなと思ったんですが、 get_previous_posts_link() さえ見つかれば案外あっさり出来ました。

$wp_query でページ情報を取得しても同ように実装可能ですが、条件分岐しなきゃいけなくなるのでだいぶ面倒です。具体的にはページネーション処理をするように「1ページ目はnextだけ出力して、最終ページはprevだけ出力して、中間ページでは両方出す」っていう判定が必要となります。。

$wp_query の方が汎用性が高い気もするんですけど、簡単な方が嬉しいので get_previous_posts_link() による振り分けを採用しました。

投稿ページとアーカイブの併用も可能

既にご紹介した投稿ページのカテゴリ内リンクとアーカイブページ同士のリンクを一つのテーマで同時に実装することも可能です。(投稿ページとアーカイブページは同時に表示する事が出来ないので、テンプレート内で同居可能という意味です。)

両方くっつけるとこんな感じ。

【functions.php】
function ozLinkRelPrevNext() {
  global $paged;
  if( is_single() ){
    echo get_adjacent_post_rel_link( $title = '%title', $in_same_term = true, $excluded_terms = '', $previous = true, $taxonomy = 'category' );
    echo get_adjacent_post_rel_link( $title = '%title', $in_same_term = true, $excluded_terms = '', $previous = false, $taxonomy = 'category' );
  }
  if( is_archive() ) {
    if ( get_previous_posts_link() ) {
      echo "<link rel='prev' href=".get_pagenum_link( $paged-1 )." />"."\n";
    }
    if ( get_next_posts_link() ) {
      echo "<link rel='next' href=".get_pagenum_link( $paged+1 )." />"."\n";
    }
  }
}
add_action('wp_head', 'ozLinkRelPrevNext');

「アーカイブ」で一括りにせず、カテゴリやタグなど個別に設定したい場合は is_archive() に相当する条件判定を調整してください。

  • is_category() … カテゴリアーカイブ
  • is_tag()    … タグアーカイブ
  • is_date()   … 年/月/日アーカイブ

投稿ページ判定に対して else を使うと 404 や固定ページなども引っかかってしまうので注意します。

おわりに

WordPressでlink rel属性をカスタマイズする

SEO対策は「これをやればどのサイトでも必ず効く」というものはありません。サイト全体の専門性やカテゴリの分別次第で効いたり逆効果だったりするのが面白くも難しいところです。

ちなみになぜ本稿のアイキャッチ画像がハニワかというと、「繋がるイメージ」の絵が欲しくて素材サイトで「輪」って入力したらこれが出てきたのでした。

ハニワかわいい。  ┏|∵|┛