制作の久保田です。

今回はWordpressのWP_Queryで、よく使うパラメータの指定方法をまとめました。
あれってどうやるんだっけ、、て時に参考になればと思います。

WP_Queryとは?

WP_Queryとは、ブログの投稿やページのリクエストを扱うWordpressのクラスです。
WP_Queryにリクエストを定義することで、現在のクエリとは異なる情報を取り出せます。

WordPressでCMSサイトを作成する場合、以下のようなケースで使用します。

  • トップページ(固定ページ)に新着情報(投稿)を表示したい
  • ブログ記事(投稿詳細)に関連記事(同一カテゴリーの投稿)を表示したい
  • ブログ一覧ページ(投稿一覧)から、お知らせ(カテゴリー)を除外したい
  • 実績(カスタム投稿)の愛知県(ターム)のみ出力したい
  • 値段(カスタムフィールドの値)を元にソートして出力したい

ここでは、WP_Queryの記述方法と、よく使う定義とを見ていきたいと思います。

ループの記述方法

通常のループ

投稿や固定ページをそのまま出力したい場合は、以下のような記述になります。

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <!-- ここに出力したい処理を記述 -->
<?php endwhile; endif; ?>

ループ内では、現在のリクエストを処理します。

WP_Queryを使用したループ

WP_Queryを使用して、現在のクエリとは異なるリクエストを処理したい場合は、以下のようになります。

<?php
$args = array(
    // ここにパラメータを定義
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) :
?>
<!-- ループ前の開始タグ -->
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    <!-- 出力したい処理を記述 -->
<?php endwhile; ?>
<!-- ループ後の閉じタグ -->
<?php endif; wp_reset_postdata(); ?>

$argsと$the_queryは、パラメータを格納する変数なので別の名前でもokです。
WP_Query( $args ) で、リクエストを定義してループ処理します。

ループ処理の部分は、通常のループと似ていますが、$the_query に対してループ処理しているので注意してください。

  • $the_query->have_posts()
  • $the_query->the_post()

AD

よく使うWP_Queryの定義

通常のブログサイトであれば、リクエストされたページ(記事の詳細や固定ページなど)がそのまま表示されればokですが、CMSサイト制作の場合は固定ページの中に投稿のリストを出力したり、関連する記事を引っ張ってきたりすることがあります。
ここでは、CMSでよく利用するWP_Queryの定義方法を見ていきます。

固定ページに特定のカテゴリーを出力

トップページ(固定ページ)に新着情報(ニュースカテゴリーの投稿)を表示させたい時などは、以下のようにします。

<?php
// 固定ページに特定のカテゴリーを表示
$args = array(
    'post_type' => 'post',
    'category_name' => 'news'
    'posts_per_page' => 3
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) :
?>
<h2>新着情報</h2>
<ul>
    <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    <li><a href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; ?>
</ul>
<?php endif; wp_reset_postdata(); ?>

post_typeは投稿タイプで、通常の投稿であればpostを指定します。
出力したいカテゴリーのスラッグをcategory_nameに指定します。
posts_per_pageは出力したい記事数です。

ループの中は、通常のループ内の記述と同じです。
最後にwp_reset_postdata()で、クエリをリセットします。

一覧から特定のカテゴリーを除外

コラムとニュースをカテゴリー分けで作成しているなど、コラムの一覧にはニュースの記事を出力したくない場合があります。

<?php
// 一覧から特定のカテゴリーを除外
$args = array(
    'post_type' => 'post',
    'category__not_in' => array( 2 )
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) :
?>
<h2>コラム一覧</h2>
<ul>
    <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    <li><a href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; ?>
</ul>
<?php endif; wp_reset_postdata(); ?>

category__not_inに除外カテゴリーのIDを配列で指定します。
パラメータは配列であることに注意してください。

カスタム投稿を出力

通常の投稿ではなく、カスタム投稿を出力したい場合は、前述のpost_typeにカスタム投稿名を指定します。

<?php
// カスタム投稿を出力
$args = array(
    'post_type' => 'voice',
    'posts_per_page' => 3
);
?>
<!-- 出力部分略 -->

タームを出力

タームとは、カスタムタクソノミーの個々のカテゴリーのことです。
通常のカテゴリーと、タームとでは出力方法が違います。
カテゴリーの出力より少し複雑ですが、カスタム投稿「お客様の声」の「愛知・岐阜」エリアを出力したい場合は以下のようになります。

<?php
// タームを出力
$args = array(
    'post_type' => 'voice',
    'posts_per_page' => 3,
    'tax_query' => array(
        'taxonomy' => 'voice_category',
        'field' => 'slug',
        'terms' => arrya( 'aichi', 'gifu' )
    )
);
?>
<!-- 出力部分略 -->

tax_queryに配列で指定します。
taxonomyはタクソノミー名を指定します。
fieldは、続くtermsで渡す値の種類を指定します。タームスラッグを渡す場合はslug、タームidを渡す場合はidを指定します。
termsにタームスラッグ(またはタームid)を配列で指定します。

指定したカスタムフィールドの値を持つ記事を出力

より複雑なCMSになってくると、例えば商品情報のページから特定のサイズのみを出力したいなど、カスタムフィールドの値を元に絞り込みたいといった場合があります。
商品カスタム投稿から、sサイズのみを絞り込む場合は、以下のようになります。

<?php
// カスタムフィールドの値で絞り込み
$args = array(
    'post_type' => 'item',
    'posts_per_page' => 3,
    'meta_key' => 'size',
    'meta_value' => 's-size',
    'meta_compare' => 'LIKE'
)
?>
<!-- 出力部分略 -->

meta_keyは、カスタムフィールド名、meta_valueはフィールドの値です。
meta_compareはmeta_valueの比較条件で、以下のような値が指定できます。
=、!=、>、>=、<、<=、LIKE、NOT LIKE、IN、NOT IN、BETWEEN、NOT BETWEEN
LIKEを指定した場合は、文字列の一致です。

カスタムフィールドの値をソートして出力

ランキングなど、カスタムフィールドの値の数値を元にソートして出力することもできます。
countフィールドの値を元にアクセスランキングを表示する場合は、以下のようになります。

<?php
// アクセスランキング
$args = array(
    'post_type' => 'post',
    'meta_key' => 'count',
    'order'	=> 'DESC',
    'orderby' => 'meta_value_num',
    'posts_per_page' => 3
);
?>
<!-- 出力部分略 -->

orderは昇順(ASC)、降順(DESC)の指定です。アクセス数の多い方から出力したいので、ここではDESCを指定します。
orderbyは、並び替えの条件を指定します。meta_value_numを指定することで、フィールドの値を数値として並び替えます。

2ページ目以降が正常に出力されないときは?

WP_Queryを指定すると、2ページ目以降が正常に表示されない場合があります。
その場合は、以下のようにpagedを指定すると表示されるようになる事が多いです。

<?php
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$args = array(
    'post_type' => 'news',
    'paged' => $paged
);
?>
<!-- 出力部分略 -->

pagedには、リクエストしたページのページ番号を指定します。

$paged = get_query_var( ‘paged’ ) ? get_query_var( ‘paged’ ) : 1;
の部分で現在表示しているページ番号を取得しています。
get_query_var( ‘paged’ ) は1ページ目であった場合空文字が帰ってくるので、空文字の場合は1をセットしています。

最後に

WordPressは、WP_Queryとテンプレート階層(条件分岐タグ)だけおさえれば、かなりいろんなカスタマイズが可能です。
WP_Queryには、他にもたくさんのパラメータがあるので、どういった絞り込みができるのかリファレンスを参照して試してみてください。