これはメモです

それ以上でもそれ以下でもないのです

同一のカスタムフィールド値を持つ投稿の前後記事リンクを出力する

前に一度やったことがあるが忘れていたのでメモ。

ぜろみやさんのブログでやってるの見たな…と思いつつ、まず自力でやってみようと思い実装しました。 以下ソース。

<?php
/**
 * 同一のカスタムフィールドを持つ前後リンクの出力
 * 
 * 取得手順
 * (1) 対象となるカスタムフィールドの投稿をサブループで全件取得する。
 * (2) (1)で取得した投稿内での、現在の記事のインデックスを取得する。
 * (3) (2)で取得したインデックスをもとに前後の記事のパーマリンクを取得する。
 * (4) 取得した前後リンクを出力する。
 */

// (1)
$current = $post;
$currentID = $current->ID;
$postIDs = array();

$args = array(
  'post_type' => $current->post_type, // 任意の投稿タイプ
  'posts_per_page' => -1, // -1で全件取得する
  'post_status' => 'publish',
  'order' => 'DESC',
  'orderby' => 'date',
  'meta_query' => array(
    array(
      'key' => 'hogehoge', // 任意のカスタムフィールド名
      'value' => 1,
      'compare' => '=',
    )
  )
);

$new_query = new WP_Query( $args );
  if( $new_query -> have_posts() ){
    while($new_query -> have_posts()){
      $new_query -> the_post();
      $postIDs[] = get_the_ID();
  }
}
wp_reset_postdata();

// (2)
$currentIndex = array_search( $currentID$postIDs );

// (3)
$prev_link = $currentIndex === count($postIDs) - 1 // 表示している記事がもっとも新しいかどうか判定
          ? ''
          : '<a href="' . get_permalink($postIDs[$currentIndex + 1]) . '">以前の記事へ</a>';

$next_link = $currentIndex === 0 // 表示している記事が最新かどうか判定
          ? ''
          : '<a href="' . get_permalink($postIDs[$currentIndex - 1]) . '">新しい記事へ</a>';
?>

<?php // (4) 
if ( $prev_link || $next_link ) : ?>
<ul class="adjacentPostLinks">
  <?php if ( $prev_link ) : ?>
    <li><?php echo $prev_link?></li>
  <?php endif?>
  <?php if ( $next_link ) : ?>
    <li><?php echo $next_link?></li>
  <?php endif?>
</ul>
<?php endif; ?>

どの記事が前後になるか?は実際に記事を取得してみないとわからないため、サブループで記事を取得してそこから抽出する形になっています。

実装した後にぜろみやさんの記事を見てみたら、同じく全件取得する形で実装されており一安心。変な実装の仕方ではないようなのでよかったです。

参考