以前、見ている記事と同じカテゴリーの最新記事一覧を表示する方法という記事を書きましたが、この方法はカテゴリーにしか対応していません。
カスタムタクソノミーを使っていて、同じタクソノミーに属する最新記事を出力したい場合もあると思います。
そこで今回は、参照中の記事と同タクソノミーに属する最新記事をサムネイル付きで一覧表示する方法を紹介します。
参照している記事と同タクソノミーに属する最新記事を一覧表示する
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などのアドレスにアクセスできるようになります。
これを追加しておかないと、シングルページ内でページ送りをした時に、元のページにリダイレクトされてしまいます。
あとがき
テーマをカスタマイズする時の参考になれば幸いです。


こんにちは。
このことを調べていたので大変参考になりました!
すいません、突然ですが1つお伺いしていいでしょうか。
これで問題なくできたのですが、
posts_per_page=Nで指定した記事数より多い場合のページングはどのように行えばいいでしょうか。
category.phpやtaxonomy.phpで書いたようなページングがうまくいかず、かなり調べたのですが、やはりわかりませんでした。
ご教授いただければ幸いです。
補足させていただきますと、
| 類似記事一覧 | 記事詳細 |
のように、左側に記事一覧を出して、右側に記事の内容(the_content())を表示したいのですが、
記事一覧が多い場合はページングを行いたいです。
よろしくお願いいたします。
reiさん、コメントありがとうございます。お返事が遅れました-o-;
長くなってしまったので、記事に加筆しました。ご確認ください。
himecasさん、
ご回答いただき、ありがとうございます!
時間をとらせてしまって大変恐縮です。
試してみます!
ありがとうございました。
本ページで紹介されていることを探していましたので、とても勉強になりました。おかげさまで実現することが出来ました。
もしよろしければひとつお教えいただきたいのですが、カスタム投稿は作成しておらず、タクソノミーのみを追加しておりますが、上記のコードにプラスして新着記事が属しているカテゴリーを表示したいのですが、うまくいきません。
お力を貸していただければ幸いです。
よろしくお願い致します。
get_the_term_listを使うのはいかがでしょうか?
例えば当ブログの場合、以下のように見出しを追加しています。
参照している記事のタームが”WordPress”だった場合、「WordPressの最新記事」という出力になります。
早速ご返信いただき誠にありがとうございます。
折角ご指導いただきましたのに私の説明が悪く申し訳ございません。
実はタクソノミー名は取得できるのですが、カテゴリー名が取得できないでいるのです。
例えば、
通常の投稿にA,B,Cとカテゴリを作成し、
追加でタクソノミーを1,2,3と作成した場合に
single.phpにて投稿内容の下部に
同じカテゴリに属する記事何件かに加え、
同じタクソノミーに属する記事を何件かを表示したいのです。
この記事にてお教えいただきました内容でほぼ完成しているのですが、
同じタクソノミーに属する記事にカテゴリー名をリンクなしで表示したいのですが、どうしてもうまく行きません。
何度も申し訳無いのですが、再度ご指導いただけますと幸いです。
参照している記事と同じカテゴリー/タクソノミーに属する新着を表示し、さらにその一覧に表示される記事が属するカテゴリーをリンクなしで出力したい、ということでよろしいですか?
新着記事一覧を表示するループの中でget_the_categoryを使うのはいかがでしょうか?具体的には、以下のような感じです。
<?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> <?php $cats = get_the_category(); foreach( $cats as $cat) { echo $cat->cat_name; } ?> </li> <?php endforeach; ?> </ul> <?php endif; wp_reset_postdata(); ?>これでリストの中にリンクなしのカテゴリーを表示することができます。
ご確認いただきありがとうございます。
ご呈示いただきましたget_the_categoryはやってみたのですが、それだとすべての関連記事のカテゴリーが参照している記事のカテゴリーとして表示されてしまうのです。
投稿記事のカテゴリーがAだとすると、関連記事がすべてAとして表示されてしまいます。
以下の記述をしておりますので、よろしければお目通しをお願い致します。
~すみません。コードはグチャッとなっていたので削除させていただきました。 by.himecas~
どこに問題があるのでしょうか。
何度も申し訳ありませんが、ご指導いただけますと幸いです。
よろしくお願い致します。
検証が甘かったです。。。失礼しました。
以下のようにget_the_categoryで投稿IDをちゃんと指定したらいけると思います。
<?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> <?php $cats = get_the_category($tax_post->ID); foreach( $cats as $cat) { echo $cat->cat_name; } ?> </li> <?php endforeach; ?> </ul> <?php endif; wp_reset_postdata(); ?>ご確認ください。
で来ました!
また、何度もしつこく聞いてしまい申し訳ございませんでした。
今回は大変勉強になりました。
本当にありがとうございます。