記事一覧の例

loopで記事一覧の出力

トップページや固定ページに「〇〇カテゴリーの記事を何件か自動で表示したい」時があるかと思います。

そんな時、「WordPressループ」を使うことで容易に表示させることができます。

ループについては以下の関数を設定することで、容易に出力が可能です。

LOOPを出力するイラスト 出力の基本:ループ

以下はこのループをカスタマイズした記事一覧の出力例です。

指定したカテゴリーの記事一覧を表示

投稿一覧の取得に使っている関数に 「get_posts」を使い、 category_name で指定した wordpress を指定しています。

表示する投稿の件数は posts_per_page で5件に指定し、orderby、orderで日付の降順で投稿を取得して出力しています。

PHP

<?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

<?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

<?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

<?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

<?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

<?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

<?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

<?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

<?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です。

functions.PHP

// 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'];
}

最大投稿数は一致させる記述が必要

ただし、「’posts_per_page’ => 10, 」と設定した場合、WordPressの管理画面の「設定」の「表示設定」における「1ページに表示する最大投稿数」も同じ10(件)に設定する必要があるので注意しましょう。