Xwriteで同一カテゴリーの投稿を前後ページャーに表示する方法

Xwrite
この記事は約6分で読めます。
記事内に広告が含まれています。

Xwrite 4.0.7

はじめに

Xwriteで、以下を実現します。

カスタマイザーに設定項目を追加し、チェックを入れると、現在の投稿と同じカテゴリーに属する投稿だけを前後記事ページャーに表示するようにします。

この記事では、この方法について説明します。

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の前後記事ページャーを現在の投稿と同一カテゴリーに属する投稿に限定できます。
カスタマイザーにチェック項目を追加しているため、設定の切り替えも簡単です。
カテゴリー内の記事を続けて読んでもらいたい場合に活用できます。

タイトルとURLをコピーしました