はじめに
カスタマイザーに設定項目を追加し、チェックを入れると、現在の投稿と同じカテゴリーに属する投稿だけを前後記事ページャーに表示するようにします。
この記事では、この方法について説明します。
XwriteとCocoonの前後記事ページャーの違い
Xwriteの場合
Xwriteでは、WordPress標準の get_previous_post() と get_next_post() を使って前後の記事を取得しています。
$prevPost = get_previous_post();
$nextPost = get_next_post();
この呼び出しでは、同一カテゴリーに限定するためのパラメータを指定していません。
そのため、標準状態ではカテゴリーを条件にせず、前後の記事を取得する仕組みになっています。
WordPress標準関数には、第1引数に true を指定することで、同じタクソノミーに属する投稿に限定する機能があります。
$prevPost = get_previous_post( true );
$nextPost = get_next_post( true );
Cocoonの場合
一方、Cocoonでは get_adjacent_post() を使って前後の記事を取得しています。
$prevpost = get_adjacent_post( $in_same_term, $excluded_terms, true, $taxonomy );
$nextpost = get_adjacent_post( $in_same_term, $excluded_terms, false, $taxonomy );
第1引数の $in_same_term に、同一カテゴリーに限定するかどうかの設定値を渡しています。
Cocoonでは、設定に応じて $in_same_term の値を変更する仕組みです。
このように、Cocoonでは前後記事を取得する段階で同一カテゴリーの条件を指定できる構成になっています。
実装イメージ

実装手順
以下のコードをfunctions.phpに追加します。
// カスタマイザーに設定項目を登録
add_action('customize_register', function ($wp_customize) {
$key = 'prev_next_same_category';
// 設定項目を登録
$wp_customize->add_setting(
$key,
array(
'default' => false,
'sanitize_callback' => 'wp_validate_boolean',
)
);
// チェックボックスを登録
$wp_customize->add_control(
$key,
array(
'section' => 'article_bottom_area',
'settings' => $key,
'label' => '同一カテゴリーのものを表示する',
'type' => 'checkbox',
'priority' => 41.5,
)
);
// 選択的更新を設定
if (isset($wp_customize->selective_refresh)) {
$wp_customize->selective_refresh->add_partial(
$key,
array(
'selector' => '.articlePagerUnit',
)
);
}
}, 20);
/**
* 前後記事ページャーを同一カテゴリーに限定
*
* @param string $where SQLのWHERE句
* @param bool $in_same_term 同一タクソノミーの投稿に限定するか
* @param array $excluded_terms 除外するタームID
* @param string $taxonomy 対象タクソノミー
* @param WP_Post $post 現在の投稿オブジェクト
* @return string 変更後のWHERE句
*/
if (!function_exists('xw_prev_next_same_category')):
function xw_prev_next_same_category($where, $in_same_term, $excluded_terms, $taxonomy, $post) {
global $wpdb;
// 管理画面・設定無効・投稿なしの場合は処理対象外
if (is_admin() || ! get_theme_mod('prev_next_same_category', false) || ! $post) {
return $where;
}
// 現在の投稿に設定されたカテゴリーを取得
$terms = get_the_terms($post->ID, 'category');
// カテゴリーがない場合は対象外にして終了
if (empty($terms) || is_wp_error($terms)) {
return $where . ' AND 1=0';
}
// カテゴリーのタームタクソノミーIDを取得
$term_taxonomy_ids = array_map(
'absint',
wp_list_pluck($terms, 'term_taxonomy_id')
);
// 同一カテゴリーの投稿に取得条件を変更
$where .= " AND p.ID IN (
SELECT object_id
FROM {$wpdb->term_relationships}
WHERE term_taxonomy_id IN (" . implode(',', $term_taxonomy_ids) . ")
)";
return $where;
}
endif;
// 前後記事の取得条件を変更
add_filter('get_previous_post_where', 'xw_prev_next_same_category', 10, 5);
add_filter('get_next_post_where' , 'xw_prev_next_same_category', 10, 5);
さいごに
今回紹介した方法を使えば、Xwriteの前後記事ページャーを現在の投稿と同一カテゴリーに属する投稿に限定できます。
カスタマイザーにチェック項目を追加しているため、設定の切り替えも簡単です。
カテゴリー内の記事を続けて読んでもらいたい場合に活用できます。

