WordPressのシングルページの記事の下に現在表示されている記事と同じカテゴリーの一覧を表示させるやり方です。いくつかやり方があるのですがトラックバックURLがおかしくなったりわけわからなくなって色々試した結果これに落ち着きました。
[ads_center]
query_postsを使ってみる
まずは現在のカテゴリーIDを取得します。カテゴリーが複数ある場合がありますが最初のカテゴリーだけを取得するようにしてみます。
foreach((get_the_category()) as $cat) { $cat_id = $cat->cat_ID; break; }
次にquery_postsに引き出す情報をパラメータで指定していきます。
query_posts( array( 'cat' => $cat_id, 'showposts' => 10, );
showpostsは表示させる件数です。ここでは10件にしています。あとはループで取得した情報を表示させていきます。
<?php if (have_posts()) : while (have_posts()) : the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> <?php endif; ?>
最後にループをリセットしておきます。これをつけないとコメントなど色々とおかしくなっちゃいます・・・
<?php wp_reset_query() ?>
これで現在と同じカテゴリーの記事が10件表示されるようになります。WordPressのフォーラムを参考にしてみました。
現在表示されている記事をリストから除外したい場合
もう少しカスタマイズしてみました。同一カテゴリーリストは表示されたのですが、現在表示されている記事もリストに入っているのでこれを表示しないようにしてみます。やり方は現在表示されている投稿IDを取得してそれをquery_postsの引数であるpost__not_inに配列で渡してあげます。
現在の投稿IDを変数に代入したい場合にはget_the_ID()を使用します。the_ID()では変数に代入できないみたいですね。
$post_id = get_the_ID(); foreach((get_the_category()) as $cat) { $cat_id = $cat->cat_ID ; break ; } query_posts( array( 'cat' => $cat_id, 'showposts' => 10, 'post__not_in' => array($post_id) ) );
最終的にやりたかったこと
なんかあとでまた忘れそうなので最終的に自分がやりたかったことは以下のとおりです。
- シングルページで現在と同じカテゴリーの一覧を表示させる
- 現在表示されている投稿は除外する
- 一覧に一つも記事がない場合は何も表示させない(リストを括っているdivなど)
ということで最終的にできたコードはこんな感じです。
<?php $post_id = get_the_ID(); foreach((get_the_category()) as $cat) { $cat_id = $cat->cat_ID ; break ; } query_posts( array( 'cat' => $cat_id, 'showposts' => 10, 'post__not_in' => array($post_id) ) ); ?> <?php if(have_posts()) : ?> <div> <ul> <?php while (have_posts()) : the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul> </div> <?php endif; ?> <?php wp_reset_query() ?>
これが正しいコードなのかはあまり自信がないのですがとりあえず今のところ問題なく表示されいるので大丈夫かと思います。query_postsは他にも色んな引数などがあるのでもっと知りたい人はCodexがとても参考になります。
テンプレートタグ/query posts
以上、シングルページに同一カテゴリーの一覧を表示するやり方でした。