WordPressの投稿記事の取得方法とループの種類まとめ

カテゴリー : WordPress

WordPressの投稿の読み込みと出力の基本

WordPressの売りといえば、ブログのように記事(ページ)を簡単に投稿することができ、それらをページの種類に応じて用意しておいたテンプレートが読み込み自動的に書き出してくれる、という点だと思います。
読み込まれたページが持っている記事情報の分だけ処理を繰り返す、「ループ」と呼ばれる機能はWordPressを理解する上で欠かせない知識となります。

 <?php
if (have_posts()) : //(1)
    while (have_posts()) ://(2)
	    the_post() ;//(3)
?>
                              
		~ループする処理記述~

<?php
    endwhile;//(4)
endif;//(5)
?> 

これがループの基本形ですね。
have_postsは、「記事が存在したらtrue、存在しなかったらfalseを戻り値として返す」という関数です。この関数はパラメータを持ちません。
the_postは、個別ページや固定ページの内容を出力する準備をする関数で、ループ開始のすぐあとに必ず記述が必要な関数です。この関数が実行されることで、読み込まれたページから1件だけを読み込み、以下その内容を出力するための準備が整います。
この関数にはパラメータも戻り値もありません。

上記の処理を簡単に説明すると、

  • (1)もしも対象となるページが投稿記事を持っていたら以下の処理を続けなさい。
  • (2)もしも対象となるページが投稿記事を持っていたら記事がある間ずっと以下の処理をループしなさい。
  • (3)出力準備完了。
  • (4)ループ処理終了。
  • (5)条件分岐(if文)終了。

のようになります。

しかしこの処理は、あくまでも「読み込まれたページが持っている記事情報」を出力する際にしか使用することができません。
例えば、自己紹介という固定ページがあったら、その自己紹介のページに記述した内容しか出力できませんし、アーカイブページではアーカイブの対象となるページの内容しか読み込み書き出すことができません。
それで特に問題がなければいいのですが、それだけの処理で済んでしまうようなサイトだったら、別にWordPressに頼る必要もなさそうな気がしてしまいます。

例えばこのポートフォリオサイトでは、トップページ(https://ayugai.com)に投稿タイプworks(制作実績)で作成した記事からカスタム分類originalに設定した投稿のみを抽出し出力し、その下に日記で投稿した最新の記事3件を読み込み出力するような処理を施しています。
トップページ自体は固定ページで作成しているので、上記の処理をしたところでその固定ページに投稿した内容しか書き出してくれません。

このような少し複雑なページを構築したい場合は、他の記事取得方法を使用します。

目次

WP_Queryオブジェクト

WordPressにはWP_Queryというクラスが用意されており、それを用いて作成されたオブジェクトを元に必要な記事を読み込んだり書き出したりする処理を行なっています。

※クラスやオブジェクトに関しては別途知識が必要になってきます。ここでは説明を省きますが、必要に応じて自分で調べてください。

通常のループ処理では、表示するページのアドレスから必要な記事情報を集め、それをWP_Queryが自動的に読み込んでくれるような仕組みになっています。なので、上記のようなシンプルなコードで処理の実行が可能になっているわけです。

そこで、少し複雑化したループ処理を行なうには、通常のWP_Queryオブジェクトとは別に、新たにWP_Queryオブジェクトを作成し、それにパラメータを渡すことで欲しい記事情報を得、出力を可能にする、という方法があります。

<?php 
$my_query = new WP_Query(array(
	'post_type' => 'works',
	'post_per_page' => '4',
));
?>

<?php if ($my_query->have_posts()) : ?>

	~条件分岐頭の処理記述~

<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>

	~ループする処理記述~

<?php endwhile; ?>

<?php else : ?>

	~条件分岐elseの処理記述~

<?php endif; ?>
新規オブジェクトの作成

まず$my_queryというWP_Queryクラスのオブジェクトを作成します。new演算子+クラス名でオブジェクトを定義します。

コンストラクタ関数に連想配列型のパラメータを渡す

そのオブジェクトに連想配列の形でパラメータを渡してあげます。
実際にはパラメータを渡すことで、クラス内に定義したコンストラクタ関数と呼ばれるものが実行され、渡された連想配列の値に応じて初期化が行われ、必要な投稿記事の情報を集めてきてくれる、という流れになっています。

この渡すパラメータ(連想配列)こそが肝で、この値をいじることによって必要な情報を柔軟に取得することを可能にしています。
上の例では、「投稿タイプworksの記事を最新のものから4件取得してきてね」というパラメータを渡し、その情報を$my_queryに格納しています。

渡せる連想配列の種類はものすごくたくさん用意されていて、これで実現できないループはほぼありません。「連想配列 パラメータ」で検索すればリファレンスを見ることができます。

if文にパラメータを渡す

if文にパラメータ$my_query->have_posts()を渡しています。新たに作ったオブジェクトなので、have_posts()と記述しただけではダメです。クラス内に定義されているhave_posts()というメンバ関数(メソッド)にアロー演算子(->)でアクセスしています。記事の有無でtrueかfalseを返します。

while文にパラメータを渡す

whileに関しても同じです。have_posts()メソッドをパラメータとして渡し、「記事がある間繰り返せ」という命令をし、the_post()メソッドで出力の準備をしています。

処理の記述

準備が整ったら通常のループ処理と同様、WordPressのテンプレートタグなどを使い、対象の記事から必要な値を取り出しながら出力していくことが可能です。

if文、while文を閉じる

処理を記述が済んだら、それぞれの構文を閉じます。

基本形のループと似てはいますが、新たにオブジェクトを作成したことで+αでする処理が増えています。
オブジェクトの知識が全くない状態でソースを見てもなんとなくは理解できると思いますが、なんとなくを少しでも潰していくことがさらに理解を深めることに繋がると思うので、多少は知識を得ておいた方がいいと思います。

query_post関数

上の例では新たにオブジェクトWP_Queryを作成しそれをループさせましたが、他に、既存のWP_Queryオブジェクトをそのまま使用し、その内容を上書きすることで、欲しい情報を得ようとする方法もあります。
そのときに使用するのがquery_postという関数です。パラメータの指定方法はWP_Queryオブジェクトを新規で作成したときと変わりません。

出来る処理はWP_Queryで全て補えるのですが、ベースとして通常読み込む記事を使用するので、本来出力する内容から少しだけ変化を加えたい時などに使用すると記述が少なくなり便利です。

<?
query_posts(
array(
	'cat' => -1,
)
); ?>
<?php if (have_posts()) : ?>

	~条件分岐頭の処理記述~
    
<?php while (have_posts()) : the_post(); ?>

	~ループする処理記述~

<?php endwhile; ?>
<?php else : ?>

	~条件分岐elseの処理記述~

<?php endif; ?>  
<?php wp_reset_query(); ?>

上記例では通常読み込む記事からカテゴリーのIDが1の記事のみを除外しています。

そもそもが通常の記事を上書きする関数なので、本来読み込むべき他のページ情報もこの関数によって上書きされてしまいます。そのため、ループ中にページの本来の情報を呼び出そうとした時に上書きされた情報が返ってきてしまうことがあるので、使用にはちょっと注意が必要な関数とも言えます。

また、最後に全ての処理が終わったらクエリを閉じるという操作が必要です。wp_reset_query()という関数がそれを行なってくれます。パラメータも戻り値もない関数です。

get_posts関数

get_posts関数はWP_Queryオブジェクトの簡易版のようなものです。パラメータの渡し方もほぼ同じですが、戻り値が投稿オブジェクトの配列になっているため、上記2つの例のような出力方法ではなく、foreach構文を用いて記事をループさせていきます。

<?php $posts = get_posts('post_type=works'); ?>
	<?php foreach($posts as $post) : setup_postdata($post); ?>

	~ループする処理記述~

<?php endforeach; ?>

get_posts関数で取得した記事情報の配列を$postsに代入、foreach構文を用いて$postsから1つずつ値を取り出し変数$postに代入しながら出力を繰り返しています。
setup_postdata()は投稿情報の初期化を行う関数で、$postをパラメータとして渡すことでループの度にその値を初期化する役割を担います。
get_posts関数に渡したパラメータはURLの形をしていますが、これはarray(‘post_type’ = ‘works’)と同じ意味です。書きやすさや読みやすさの違いだけです。

まとめ

長々と書いてきましたが、「記事情報を取得し、ループしながらその値を出力していく」という方法は基本系を含めこの4パターンしかありません。
もちろん部分部分に使う要素として、カテゴリーの情報を取得したりコメントの情報を取得したりと、用途に応じて様々な関数とループ法がWordPressにはありますが、記事のループの基本さえ覚えておけば他はそれの応用とも言えるので、1からWordPressを始めるときは、これくらいの前知識とソースを読む力があれば、作業を進めていくのが楽になるかなぁと思います。

くどいくらいにしつこく説明してしまった箇所もありますが、最初PHPの知識ほぼなしでWordPressでのサイト構築に挑んだ自分としては、これくらい丁寧に、1つ1つコードを読み解いていった方が、結果的に効率良く理解を深めていくことが出来たので、そのときの備忘録も兼ねて記事として残しておきます。

コメントは受け付けていません。