カスタム投稿タイプのsingle.phpで、前後記事へのリンクを1
カスタム投稿タイプ、カスタムタクソノミーを使用している場合、案件によっては、前後記事へのリンクの設定にカスタマイズを求められる時があります。
目標
同じカスタム投稿タイプの前後記事リンクを表示
同じターム(カテゴリー)に属する前後記事リンクを表示
コード:同じカスタム投稿タイプの前後記事リンクを表示
以下のコードを、single.phpの前後記事リンクを貼りたい部分に挿入させる。
$postListArgs = array( 'posts_per_page' => -1, 'post_type' => get_post_type(), ); //先ずは、同じ投稿タイプの記事一覧を取得 $sameGroupPosts = get_posts( $postListArgs ); //取得した記事の、投稿ID一覧を$ids配列に納める $ids = array(); foreach ($sameGroupPosts as $eachPost) { $ids[] = $eachPost->ID; } //現在の投稿IDが、$ids配列のどこに有るか探し、その前後の投稿IDを取得 $thisIndex = array_search($post->ID, $ids); $prevId = $ids[$thisIndex+1]; $nextId = $ids[$thisIndex-1]; //前後の投稿IDがあれば、それらを表示させる if ( !empty($nextId) ) { echo '<li class="prev"><a rel="next" href="' . get_permalink($nextId) . '"> 前の記事 </a></li>'; } if ( !empty($prevId) ) { echo '<li class="next"><a rel="prev" href="' . get_permalink($prevId). '"> 次の記事 </a></li>'; }
コード:同じタームに属する前後記事リンクを表示
以下のコードを、single.phpの前後記事リンクを貼りたい部分に挿入させる。
/* この記事の属しているタクソノミーとタームを以下のように仮定する。 カスタムタクソノミー:$thisTaxonomy ターム(配列):$thisTermSlugs タームは、 $thisTerms = get_the_terms($post->ID, $thisTaxonomy); foreach($thisTerms as $eachTerm): $thisTermSlugs[] = $eachTerm->slug; endoforeach; あたりで取得する。 この記事が、複数のタームに属している場合、上の方法だと複数のタームにまたがって記事をサーチする事になるので、それを希望しない場合は、タームスラッグをなんとかして固定で設定すること。 */ $postListArgs = array( 'posts_per_page' => -1, 'post_type' => get_post_type(), 'tax_query' => array( array( //カスタムタクソノミーを指定 'taxonomy' => $thisTaxonomy, //termをslugで指定 idでする場合は、下のfieldの値を、slugからIDに変更すること 'terms' => $thisTermSlugs, 'field' => 'slug', 'operator' => 'IN', ), 'relation' => 'AND', ), ); //先ずは、同じ投稿タイプ、同じタクソノミー、同じタームの記事一覧を取得 $sameGroupPosts = get_posts( $postListArgs ); //取得した記事の、投稿ID一覧を$ids配列に納める $ids = array(); foreach ($sameGroupPosts as $eachPost) { $ids[] = $eachPost->ID; } //現在の投稿IDが、$ids配列のどこに有るか探し、その前後の投稿IDを取得 $thisIndex = array_search($post->ID, $ids); $prevId = $ids[$thisIndex+1]; $nextId = $ids[$thisIndex-1]; //前後の投稿IDがあれば、それらを表示させる if ( !empty($nextId) ) { echo '<li class="prev"><a rel="next" href="' . get_permalink($nextId) . '"> 前の記事 </a></li>'; } if ( !empty($prevId) ) { echo '<li class="next"><a rel="prev" href="' . get_permalink($prevId). '"> 次の記事 </a></li>'; }