WordPressで特定の記事のみを表示したい場合には、記事一覧を表示することができるループで特定の記事の取得と表示ができます。
WordPressのトップページやサイドバーなどに特定の記事のみを何件かピックアップして表示したい。または特定の記事のみを厳選して人気の記事として表示したい。などをループで取得して表示する方法を紹介します。
WordPressで特定の記事のみをループで取得
WordPressで特定の記事のみに限定して任意の記事を表示したい場合には、WordPressのループのうちの一つ「サブループ」をWP_Queryクラスを使って使用します。
サブループはメインループで表示するメインクエリの記事データとは別に、任意で指定した条件で絞り込んで投稿データを取得することができます。つまり特定の記事のみを絞り込んで表示するためのデータをループ処理できるのがサブループです。
<?php
$args = array(
//特定の記事のみを取得する条件を指定
);
$set_query = new WP_Query( $args );// WP_Queryオブジェクト生成
?>
//ループ処理
<?php if ( $set_query->have_posts() ): ?>
<?php while ( $set_query->have_posts() ) : $set_query->the_post(); ?>
<?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
特定の記事のみを取得して表示するための条件を組み込むときは、上のPHPコード2行目に記述してる$argsに連想配列でインスタンスを作成します。
配列にはWordPressのWP_Queryで用意されてるパラメータを使用します。
おそらく、インスタンスを作成するときに、どのようなWordPressのWP_Queryパラメータを使うと特定の記事のみを取得できるのかを理解するのが1番覚えやすいと思います。
記述はそんなに難しくないのでWordPressで1件と5件の特定記事を取得する書き方を例に説明します。
1件の特定の記事のみを取得
WordPressのCodexでWP_Queryのページに、たくさんのパラメータがあるのですが、WordPressで1件の特定の記事のみを取得する場合は、post_typeとpかpageというWP_Queryのパラーメータを$argsの配列で記述します。
- pは投稿の特定の記事のみを取得する場合
- pageは固定ページの特定の記事のみを取得する場合
1:投稿ページを特定の記事として取得する書き方
<?php
$args = array(
'post_type' => 'post',
'p' => 55,
);
$set_query = new WP_Query( $args );
?>
「post_type」
投稿タイプに関連付けた投稿を表示できます。
1件の特定の記事のみを「投稿ページ」から特定する必要があるので、’post_type’ => ‘post’,と記述。
postは投稿を表示するという意味です。またデフォルトの投稿タイプもpost です。
「p」
pというパラメータには投稿記事のIDを指定します。’p’ => 55,のように指定すると特定の記事として、その投稿記事idの投稿情報を取得できるので、ループを処理すると表示できます。
そして配列にWordPressのパラメータで作ったインスタンスはWP_Queryクラスをnewします。
2:固定ページを特定の記事として取得する書き方
<?php
$args = array(
'post_type' => 'page',
'page_id' => 1691,
);
$set_query = new WP_Query( $args );
?>
パラメータのpost_typeにpageを指定します。’post_type’ => ‘page’,と記述します。
「page_id」
パラメータのpage_idで特定の記事として取得する固定ページの記事idを’page_id’ => 1691,のように記述します。
そして配列で作ったインスタンスはWP_Queryクラスをnewします。
例えば’page_id’ => 1691,と記述したら、固定ページで1691がついたidの固定ページが特定のページとして取得でき、ループ処理の記述をすると表示できます。
5件の特定の記事のみを取得
WordPressで5件の特定の記事のみを取得する場合は、post_typeとpost__inかpost__idというWP_Queryのパラーメータを$argsの配列に記述します。
- post__inは投稿の特定の記事だけに絞って複数取得をする場合
- post__idは固定ページの特定の記事だけに絞って複数取得をする場合
1:投稿ページを特定の記事5件のみ取得する書き方
<?php
$args = array(
'post_type' => 'post',
'post__in' => array(11,12,13,14,15),
);
$set_query = new WP_Query( $args );
?>
WordPressの投稿ページから「5件」特定の記事のみを取得する場合は、post_typeパラメータを使ってpostにします。
‘post_type’ => ‘post’,と記述します。
そしてpost__inパラメータにarrayを使って表示したい特定の投稿記事のみの投稿idを指定します。
例えば’post__in’ => array(11,12,13,14,15),のように投稿の記事idを5件指定します。
そして配列で作ったインスタンスはWP_Queryクラスをnewします。
サブループの記述をして実行すると以下のような表示ができます。
2:固定ページで特定の記事5件のみ取得する書き方
<?php
$args = array(
'post_type' => 'page',
'post__id' => array(21,22,23,24,25),
);
$set_query = new WP_Query( $args );
?>
WordPressの固定ページから「5件」特定の記事のみを取得する場合は、WP_Queryのpost_typeパラメータを使ってpageにします。
‘post_type’ => ‘page’,と記述します。
そしてpost__idというWP_Queryのパラメータにarrayを使って表示したい特定の固定ページのみの記事idを指定します。
例えば”post__id’ => array(21,22,23,24,25),のように固定ページのidを5件指定します。
post__idはパラメータの配列に並んだ投稿 IDの順になります。他のパラメータを使うと特定の記事のみの記事一覧の並び順を変更できます。
詳しくはCodesの順序づけパラメータに目を通してみてください。
そして配列で作ったインスタンスはWP_Queryクラスをnewします。
WP_Queryのサブループで特定の記事のみ表示
WordPressに特定の記事のみをループさせるためにWP Queryクラスのインスタンスを配列$argsに作成して変数に代入したのが、ここまで作成してきたことです。
あとは特定の記事のみをループで表示させます。作成したWP_Queryクラスのインスタンスを使ってサブループで実行するPHPを記述します。
<?php
$args = array(
'post_type' => 'post',
'post__in' => array(65,69,73),
);
$set_query = new WP_Query( $args );
?>
<div>
<?php if ( $set_query->have_posts() ): ?>
<?php while ( $set_query->have_posts() ) : $set_query->the_post(); ?>
<a href="<?php the_permalink(); ?>"><?php the_title('<h2>','</h2>'); ?></a><br />
<?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
</div>
上のPHPコードは、特定の記事のみをWordPressのパラメータで配列を作成し、WP Queryクラスのインスタンスの下にWP Queryのサブループを記述したPHPです。
サブループには特定の記事のみで表示したい3件の記事タイトルをリンクつきで表示できるようにしてます。
WordPressのサブループは$set_query->have_posts()で表示する特定の記事があるかどうか判断し、投稿があれば該当する特定の記事だけwhileループで処理を繰り返します。whileループ内ではthe_postが次の投稿に進める役割をしてくれます。
ループ終了後はwp_reset_postdata()を記述します。
wp_reset_postdata()は、上のサブループ処理でいうと$set_query->the_post()がグローバル変数 $post を上書きするので、書き換えられた$postの値を元に戻すためのリセットが必要だからです。
こうしてWP Queryのサブループで処理した特定の記事のみの表示は、特定の記事を複数設定した場合、WordPressで特定の記事のみで表示した記事一覧になります。
特定の記事を一つ設定した場合は、WordPressが一つの記事情報を取得して、特定の記事1件のみを表示できます。
まとめ
WordPressのメインループの場合は、ページのURL(パラメータ―)から$wp_queryに保存するデータを判断して、そのページに適したループ処理をするので、特定の記事のみループで取得して表示するという処理ができないかと思います。
一方でWordPressのサブループをwp_queryで作ると投稿の条件を指定する連想配列を渡すことができるので、今回のような特定の記事のみループで取得して表示することも含めて、表示したい記事のみを絞り込んで幅広い表示形式を作成できるので是非覚えておきたいテクニックです。