トップページや固定ページに「〇〇カテゴリーの記事を何件か自動で表示したい」時があるかと思います。
そんな時、「WordPressループ」を使うことで容易に表示させることができます。
ループについては以下の関数を設定することで、容易に出力が可能です。
出力の基本:ループ以下はこのループをカスタマイズした記事一覧の出力例です。
目次
指定したカテゴリーの記事一覧を表示
投稿一覧の取得に使っている関数に 「get_posts」を使い、 category_name で指定した wordpress を指定しています。
表示する投稿の件数は posts_per_page で5件に指定し、orderby、orderで日付の降順で投稿を取得して出力しています。
<?php
$arg = array(
'posts_per_page' => 5, // 表示する件数
'orderby' => 'date', // 日付でソート
'order' => 'DESC', // DESCで新しい、ASCで古い順に表示
'category_name' => 'wordpress' // 表示したいカテゴリーのスラッグを指定
);
$posts = get_posts( $arg );
if( $posts ): ?>
<ul>
<?php
foreach ( $posts as $post ) :
setup_postdata( $post ); ?>
<li><?php the_time( 'Y.m.d' ); ?><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>
<?php
endif;
wp_reset_postdata();
?>
指定したタグの記事一覧を表示
タグの記事一覧の取得も、「get_posts」の関数を使い記事一覧を表示しています。
tag で指定した php を5件出力しています。
<?php
$arg = array(
'posts_per_page' => 5, // 表示する件数
'orderby' => 'date', // 日付でソート
'order' => 'DESC', // DESCで新しい、ASCで古い順に表示
'tag' => 'php' // 表示したいタグのスラッグを指定
);
$posts = get_posts( $arg );
if ( $posts ): ?>
<ul>
<?php
foreach ( $posts as $post ) :
setup_postdata( $post ); ?>
<li><?php the_time( 'Y.m.d' ); ?><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>
<?php
endif;
wp_reset_postdata();
?>
記事と同じタグをもつ記事一覧を表示
その記事と同じタグをもつ記事一覧を出力する場合は「WP_Query」を使用して出力します。
<?php
$tags=wp_get_post_tags($post->ID, array('orderby'=>'rand'));
if($tags):
?>
<?php
$tag_id=$tags[0]->term_id;
$args=array(
'tag__in'=>array($tag_id), // 同タグの記事を取得するよ
'post__not_in'=>array($post->ID),// 現在表示中の記事は除く
'showposts'=>5,// 記事数 -1にすると全記事表示
'caller_get_posts'=>1,// 取得した記事の何番目から表示するか
);
//wp_query
$my_query=new WP_Query($args);
if($my_query->have_posts()):
?>
<!-- ここからループの出力 -->
<ul>
<?php while($my_query->have_posts()): $my_query->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_post_thumbnail("side_thumbnails"); ?>
<?php the_title(); ?>
</a>
</li>
<?php endwhile; ?>
</ul>
<?php endif; wp_reset_query(); endif;?>
カスタム投稿も含めた全部の記事一覧を表示
固定ページやトップページに、サブクエリの「WP_Query」を使用して、カスタム投稿も含めた記事一覧を出力します。
<?php
$post_types = get_post_types(array('public' => true, '_builtin' => false));
array_push($post_types, 'post');
$args = array(
'post_type' => $post_types,
'post_status' => 'publish',
'posts_per_page' => -1, // 記事数 -1にすると全記事表示
'orderby' => 'date', // 日付でソート
'order' => 'DESC', // DESCで新しい、ASCで古い順に表示
);
$the_query = new WP_Query($args);
?>
<?php if ($the_query->have_posts()) : ?>
<?php while ($the_query->have_posts()) : $the_query->the_post(); ?>
<?php
$post_type = get_post_type();
$label = get_post_type_object($post_type)->label;
?>
<!-- ここにループの出力を書きます -->
<?php endwhile; ?>
<?php endif; ?>
通常投稿を表示させない場合は、2行目の「’_builtin’ => false」をtrueにすればカスタム投稿タイプだけの表示になります。
複数指定した記事の一覧を表示
固定ページや、複数のカスタム投稿をまとめて最新の10件を表示する場合 post_type を複数指定して表示します。
<?php
$arg = array(
'post_type' => array('投稿タイプA','投稿タイプB','投稿タイプC'),
'orderby' => 'post_date',
'showposts' => 10
);
?>
<?php $posts = get_posts($arg); ?>
<?php foreach($posts as $post):
setup_postdata($post); ?>
<!-- ここにループを書きます -->
<?php endforeach;
wp_reset_postdata();?>
キーワードを指定して関連記事を表示する方法
タイトルや本文に指定するキーワードが含まれている記事を10件表示する場合、以下のように記述します。
<?php
$args = array(
'post_type' => 'post', // 投稿タイプの指定
'post_status' => 'publish', // 公開済の投稿を指定
'posts_per_page' => 10, // 投稿件数の指定
'post__not_in' => array($post->ID), // 現在表示している投稿を除外
'orderby' => 'rand', // ランダム
's' => 'キーワード' // キーワードを指定
);
$the_query = new WP_Query($args); if($the_query->have_posts()):
?>
<ul>
<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
<li><a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a></li>
<?php endwhile; ?>
</ul>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<!-- 投稿が無い場合の処理 -->
<?php endif; ?>
キーワードを複数指定する場合は、カンマ(,)やスペースで対象にするキーワードを指定します。
閲覧中の記事を除外して出力
現在閲覧中の投稿ID(記事)を除外するには、$id = get_the_ID();
で現在の投稿IDを取得し、 post__not_in
で取得した投稿IDを除外をして出力します。
<?php
$id = get_the_ID();
if (have_posts()) :
query_posts(array(
'post__not_in' => array($id),
'posts_per_page' => -1));
?>
<?php endwhile; endif; ?>
カスタムタクソノミーで指定のタームに属する記事一覧を出力
CPT UIでカスタムタクソノミーを作り、指定のタームに登録してある記事一覧を出力するには以下の通りです。
<?php query_posts( array(
'post_type' => 'blog', //カスタム投稿名を指定
'taxonomy' => 'color', //タクソノミー名を指定
'term' => 'red', //タームのスラッグを指定
'order' => 'DESC', // 最新順'DESC'・古い順'ASC'
'posts_per_page' => 20, //表示件数(-1で全ての記事を表示)
)); ?>
<?php if (have_posts()): while (have_posts()): the_post(); ?>
<!-- ここに出力内容の中身 -->
<?php endwhile; endif; ?>
<?php wp_reset_query(); ?>
ページネイション付きの記事一覧を出力
サブクエリのWP_Queryを使ってページネイションを出力する際、以下のコードでループを回して記事一覧とページネイションを出力します。
<?php
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array(
'post_type' => array('post'), // 投稿タイプの指定
'post_status' => array('publish'), // 公開ステータスのものだけ出力
'order'=>'desc', // descで降順
'orderby'=>'post_date', // 投稿日付でソート
'paged' => $paged, // ページャーON
'posts_per_page' => 10, // 1ページあたりの表示数
);
$query = new WP_Query($args);
if ( $query->have_posts() ) :
while ( $query->have_posts() ) : $query->the_post(); ?>
<!-- この中に出力内容 -->
<?php endwhile;
endif;
wp_reset_postdata();
$big = 999999999;
echo paginate_links(array(
'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
'show_all' => true,
'type' => 'list',
'format' => '?paged=%#%',
'current' => max(1, get_query_var('paged')),
'total' => $query->max_num_pages,
'prev_text' => '前へ',
'next_text' => '次へ',
));
?>
上記のコードを使ったfront-page.phpをトップページに設定すると「2ページ目以降が表示されない」問題が起きるので、その場合は以下のコードをfunctions.phpに記述すればOKです。
// front-page.phpでページャーを有効
add_action( 'parse_query', 'my_parse_query' );
function my_parse_query( $query ) {
if ( ! isset( $query->query_vars['paged'] ) && isset( $query->query_vars['page'] ) )
$query->query_vars['paged'] = $query->query_vars['page'];
}