こんにちは、Ryohei(@ityryohei)です!

WordPressのループ内で投稿に関する情報を取得する方法のご紹介です。

WordPressで必ず使用するテンプレートのメインループと、データを指定して取得するしサブループでは、投稿に関する情報を取得する方法が若干異なります。本記事では、メインループ内でテンプレートタグを使って投稿に関するデータを取得する方法と、WP_Queryから取得した投稿情報からループ内でよく利用するデータの取得する方法をそれぞれご紹介したいと思います。

では、解説していきます。

ループのおさらい

ループにはメインループと呼ばれるものと、サブループと呼ばれる2種類のループがあります。各ループについて、詳しくではなくざっくりとおさらいしていきたいと思います。

メインループ

メインループはどのテーマでも必ず使用されています。下記のような記述になります。

<?php

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();
        //ループ内の処理
    }
}

?>

このメインループと呼ばれるループは、テンプレートによって表示されるデータが異なります。例えば「page.php」であれば固定ページの内容が表示されますし、「category.php」であれば該当するカテゴリーの内容が表示されます。「single.php」であれば該当の投稿内容が出力されます。

処理の流れとしては、ユーザーからリクエストがあったタイミングでデーターベースから必要なデータを取り出し、それを該当のテンプレートに表示する、といった流れになります。このようにテンプレートの種類によって表示されるデータが異なるループをメインループと言います。

サブループ

ではサブループとはなんでしょうか。サブとついている通りメイン以外のループを指している、というのは容易に想像できるかと思います。

サブループというのは、メインループ以外でデータを取得あるいは出力する全てのループ処理を指しています。WP_Queryやquery_postsなどで取得した内容を表示する際にループで処理しますが、それらももちろんサブループとなります。サブループを使用する場合は一時的にメインループから外れるため「wp_reset_postdata();」のような記述でメインループに戻すことがお約束になっていますね。

サブループはメインループでは取得することができないデータを取得する場合に使用します。その際に使用される代表的なものが「WP_Query」になります。

WP_Queryは条件を指定して投稿情報をオブジェクトで返してくれるクラスです。取り出したい情報を細かく指定することができ、必要な投稿情報を取得することができるため、多くの場面で利用されています。一例ですが、WP_Queryは下記のように記述します。

<?php
//条件指定
$args = array(
  'post_type' => 'post_type',
  'post_status' => array('publish'),
  'order'=>'desc',
  'orderby'=>'post_date',
  'posts_per_page' => '10'
);

$query = new WP_Query($args);

if($query->have_posts()){
  while($query->have_posts()){
    //次の投稿へ進む
    $query->the_post();

    // ループ内の処理を記述
  }
}else{
  //投稿がない場合の処理
}
wp_reset_postdata();
?>

上記の例では、$argsの変数に取得したい投稿の条件を指定して、その条件をWP_Queryに渡し、データベースから返ってきたデータを$queryという変数で受け取っています。後はいつも記述するループの要領で$queryから情報を出力していきます。
WP_Queryは非常に多くの情報を返してくれますが、今回は投稿に関する情報なのでpostのデータに着目します。postには一つの投稿に関する情報が格納されています。それをループして、一つ一つ取り出し、一覧として出力します。$queryの中身を見てみると、postは下記の情報を持っていることがわかります。

ID 投稿ID
post_author 投稿者ユーザID
post_date 投稿日時
post_date_gmt 投稿日時(グリニッジ標準時)
post_content 投稿本文
post_title 投稿タイトル
post_excerpt 投稿抜粋
post_status 公開状態
comment_status コメント受付状態
ping_status ピンバック、トラックバック受付状態
post_password 投稿閲覧パスワード
post_name スラッグ
to_ping ピン通知URL
pinged ピン通知済URL
post_modified 投稿更新日時
post_modified_gmt 投稿更新日時(グリニッジ標準時)
post_content_filtered -
post_parent 投稿親ID
guid 投稿識別子(URL形式)
menu_order 固定ページ表示順序
post_type 投稿タイプ
post_mime_type 添付ファイル種類
comment_count 投稿コメント数
filter -

上記をざっと見てみると、WP_Queryで取得したデータは投稿内容を表示する上で必要な情報のほとんどを持っていることがわかります。

では早速、ループ内で頻繁に利用する値の取得方法を一つ一つ見ていきましょう。今回はテンプレートタグとWP_Queryで取得したデータの出力方法をご紹介していきたいと思います。

IDを取得する

IDというのは投稿に割り当てられた一意の数値になります。管理画面で任意の投稿を開いてURLを確認すると、post=○○○○というパラメータがあります。こちらの数値が投稿IDと呼ばれるもので、その投稿だけが持つ値となります。IDを指定することでどこからでもその投稿を呼び出したりすることができるので、確認方法を覚えておくと役に立つかもしれません!

テンプレートタグ

下記はテンプレートタグでIDを取得する方法です。

get_the_ID();

WP_Query

下記はWP_Queryで取得した情報からIDを取得する方法になります。

$query->post->ID;

投稿者名を取得する

投稿者名というのは、投稿を執筆したユーザーの名前となります。

テンプレートタグ

下記はテンプレートタグで投稿者名を取得する方法です。

get_the_author();

WP_Query

WP_Queryのpostには投稿者名の情報はないため、get_userdataを利用して、ユーザIDからユーザ情報をすべて取得して姓と名を結合します。

$userdata = get_userdata($query->post->post_author);
$userdata->last_name . $userdata->first_name;

ステータスを取得する

投稿の公開状態を取得します。

テンプレートタグ

下記はテンプレートタグのget_post_statusを利用して取得しています。

get_post_status();

WP_Query

下記はWP_Queryで取得した情報から公開状態を取得する方法になります。

$query->post->post_status;

スラッグを取得する

投稿のスラッグは下記のように取得します。

$query->post->post_name;

タイトルを取得する

タイトルは投稿につけたタイトルになります。管理画面では基本的に一番上に入力欄が設けられています。

テンプレートタグ

get_the_title();

WP_Query

$query->post->post_title;

本文を取得する

投稿に入力した本文をすべて取得します。

テンプレートタグ

the_content();

WP_Query

$query->post->post_content;

投稿タイプを取得する

投稿タイプはpostやpage、カスタム投稿の場合はカスタム投稿のpost_typeとなります。

テンプレートタグ

get_post_type();

WP_Query

$query->post->post_type;

パーマリンクを取得する

パーマリンクは投稿のURLです。パーマリンクは「設定」の「パーマリンク設定」にて設定した値となります。

get_permalink();

アイキャッチ画像を取得する

下記では諸々必要なタグを含めた値が出力されます。

the_post_thumbnail();

アイキャッチ画像のURLを取得する

アイキャッチ画像のURLだけを取得したい場合はこちらの方法が有用です。

wp_get_attachment_url(get_post_thumbnail_id());

投稿日を取得する

投稿した日を取得します。日付のフォーマットは「設定」の「一般設定」にて設定している日付フォーマットとなります。

get_the_date();

投稿日のフォーマットを指定してを取得する

ループ内限定で日付フォーマットを変更されたい場合は下記のようにフォーマットを指定してあげると、良い感じの値が取得できます。

get_the_date('Y/n/j');

タクソノミーのターム情報を取得する

こちらはカスタム投稿のタクソノミーを指定して、タームの情報を取得する方法です。下記ではタームの名前とスラッグを取得しています。

$terms = get_the_terms($query->post->ID, 'taxonomy');
foreach($terms as $term){
    echo $term_slug = $term->slug;
    echo $term_name = $term->name;
}

最後に

いかがでしたでしょうか。

本記事ではメインループとサブループのざっくりとしたおさらいと投稿という部分に焦点をあてて取得することが可能な情報をご紹介してきました。

今後Wordpressを構築してい際に便利そうな内容があれば随時追加していければと思います。

以上、Wordpressのループ内で投稿に関する情報を取得する方法のご紹介でした!

この記事を書いた人

Ryohei

Webエンジニア / ブロガー

福岡のWeb制作会社に務めるWebエンジニアです。エンジニア歴は10年程で、好きな言語はPHPとJavaScriptです。本サイトは私がインプットしたWebに関する知識を整理し、共有することを目的に2015年から運営しています。Webに関するご相談があれば気軽にお問い合わせください。