以前、見ている記事と同じカテゴリーの最新記事一覧を表示する方法という記事を書きましたが、この方法はカテゴリーにしか対応していません。
カスタムタクソノミーを使っていて、同じタクソノミーに属する最新記事を出力したい場合もあると思います。
そこで今回は、参照中の記事と同タクソノミーに属する最新記事をサムネイル付きで一覧表示する方法を紹介します。
参照している記事と同タクソノミーに属する最新記事を一覧表示する
single.phpなどテーマファイル内の表示させたい場所に、以下のコードを追加します。タクソノミー名はcustomとしています。
<?php
$term = array_shift(get_the_terms($post->ID, 'custom'));
$tax_posts = get_posts('post_type=post&posts_per_page=5&taxonomy=custom&paged='.$paged.'&term='.esc_html($term->slug)); if($tax_posts):
?>
<ul>
<?php foreach($tax_posts as $tax_post) : setup_postdata($post); ?>
<li><a href="<?php echo get_permalink($tax_post->ID); ?>"><?php echo get_the_post_thumbnail( $tax_post->ID, array(120,120) ); ?><?php echo esc_html($tax_post->post_title); ?></a></li>
<?php endforeach; ?>
</ul>
<?php endif; wp_reset_postdata(); ?>
2行目、3行目にある”custom”の部分は、最新記事を表示したいタクソノミー名に変更してください。
カスタム投稿タイプで使う場合は、3行目でpost_typeをカスタム投稿名に変更してください。posts_per_pageが表示する件数、taxonomyがタクソノミー名です。
出力する記事の一覧はリスト形式になっていますが、divなどに変更してもOKです。
ページ送りをつける場合
rei様よりページ送りもつけたいとのコメントをいただいたので、ページ送りをつける方法を紹介します。
まずsingle.php内のコードは、以下のようにします。
<?php
$tax = 'custom';
$term = array_shift(get_the_terms($post->ID, 'custom'));
$term = esc_html($term->slug);
$posts_per_page = 5;
$paged = '';
$content = '';
$list_content = '<li><a href="%1$s">%2$s</a></li>';
$list_wrapper = '<ul>%1$s</ul>';
$pagination_wrapper = '<div class="pagination">%1$s</div>';
$paged= get_query_var('paged');
if ( !isset( $posts_per_page ) ) {
$posts_per_page = get_option('posts_per_page');
}
$args= array('paged' => $paged , 'posts_per_page' => $posts_per_page, 'taxonomy' => $tax, 'term' => $term );
if ( ! is_paged() ) {
$args['numberposts'] = $posts_per_page;
$paged = 1;
} elseif($paged== 2) {
$args['offset'] = $posts_per_page;
} else {
$args['offset'] = $posts_per_page * ( $paged-1 );
}
$paging_contents= get_posts( $args );
if ( $paging_contents ) {
foreach ($paging_contents as $q){
$content .= sprintf( $list_content, esc_url( $q->guid ), $q->post_title );
}
printf( $list_wrapper, $content );
}
$total_content= get_posts('numberposts=-1');
$page_total = ceil( count( $total_content ) / $posts_per_page );
$pagination = array(
'base'=> @add_query_arg( 'paged', '%#%' ),
'format'=> '',
'total'=> $page_total,
'current'=> $paged,
'show_all'=> false,
'type'=> 'plain'
);
if( $wp_rewrite->using_permalinks( ) ){
$pagination['base']= user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );
}
if( $page_total - $paged >= 0 ){
printf($pagination_wrapper, paginate_links( $pagination ) );
}
?>
例によって、2行目3行目にある”custom”の部分は、最新記事を表示したいタクソノミー名に変更します。5行目にある「$posts_per_page = 5;」が1ページに表示する件数なので、表示件数を変えたい場合は数字の部分を変更してください。
ページ送りの部分には、paginationというクラスが付与されるので、あとはCSSで見た目を整えます。
続いて、functions.phpに以下のコードを追加します。
function disable_redirect_canonical( $redirect_url ) {
if ( is_single() ){
$subject = $redirect_url;
$pattern = '/\/page\//';
preg_match($pattern, $subject, $matches);
if ($matches){
$redirect_url = false;
return $redirect_url;
}
}
}
add_filter('redirect_canonical','disable_redirect_canonical');
上記コードを追加することで、シングルページ内でも/page/2などのアドレスにアクセスできるようになります。
これを追加しておかないと、シングルページ内でページ送りをした時に、元のページにリダイレクトされてしまいます。
あとがき
テーマをカスタマイズする時の参考になれば幸いです。

コメントを残す