WordPressではhead要素に隣接する記事の<link rel="next"><link rel="prev">がデフォルトで出力される(まともなテーマなら)。これらのLINK要素は隣接する前後の記事やページネーションされた記事を参照させるために存在するのだが、このLINK要素を同じカテゴリに限定させることが出来ない。一応、要素を出力する関数に引数を渡せばできるのだが、その関数を呼び出すコードがハードコードされているので結局はマニュアルで対応させなければならない。

動作としては既に存在する関数を引数を追加して呼び出すだけ、と簡単。なのでプラグインが存在していそうだと思い検索してみたが、adjacentとかsame category linkとかで検索してもそれっぽいものが見つからない。絶対にありそうだが、正しい検索ワードがわからないから困った。それで結局、自分で書いた。悲しい。ぴえん🥺。いや、使い方わからんわ。

<?php
/*
Plugin Name: Same category adjacent posts link in head
Description: WordPressの単一記事ヘッダ内の隣接記事Linkを同じカテゴリに限定させるplugin
Version: 1.0.0
Auther: Aquei
Author URI: https://blog.srytk.com/aquei/
License: CC0
 */

namespace wordpress\plugin\samecategory;

function samecat(){
	if(! is_single() || is_attachment() || has_action('wp_head', 'adjacent_posts_rel_link_wp_head') === False){
		return;
	}

	//デフォルトのフックを削除
	$result = remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10);

	//変わりのフックを追加
	if($result){
		add_action('wp_head', __NAMESPACE__ . '\\samecat_cb');
	}
}

function samecat_cb(){
	adjacent_posts_rel_link('%title', True);
}	

add_action('wp', __NAMESPACE__ . '\\samecat');

とりあえず期待通りの動作になった。最初、条件分岐タグが使えるのは WordPress の posts_selection アクションフックの後のみだとしらなくてちょっと詰まった。ぴえん🥺。二回目!!!