コース一覧

投稿一覧の作り方

  • 投稿一覧の作成手順
  • ループ処理について

今回は、WordPressで「投稿一覧ページ」を作る方法について解説します。
この方法を使えば、WordPressの管理画面から投稿した記事をサイト上で一覧表示できるようになります。

投稿一覧の作成手順

投稿一覧ページの作成手順は以下の通りです。
これから紹介する手順に従って進めていきましょう。

完成イメージ:完成図を見る

1. 投稿記事の作成

WordPressの管理画面にログインし、「投稿」→「新規投稿を追加」ボタンをクリックして新しい投稿記事を作成します。

2. 投稿記事の編集と設定

ここでは、作成した投稿記事に必要な情報を入力し、公開できる状態に整えていきます。
今回は、「お知らせページ」の一覧に表示する記事を例に、実際に編集設定を進めてみましょう。

タイトルとコンテンツを入力
タイトル入力欄にタイトルを入力し、本文エリアにコンテンツを入力します。

URLスラッグを設定
投稿記事のURLスラッグを設定します。
管理しやすくするために、スラッグには投稿ID(例:9105)などを指定しておくと便利です。

公開設定を確認し、公開
❶と❷の設定が完了したら、「公開」ボタンをクリックします。公開後、設定したURL(例:https://ドメイン/投稿ID/)にアクセスして、正しく表示されているか確認しましょう。

3. 固定ページで一覧を表示

ここでは、固定ページを作成し、カスタムテンプレートを使ってページのコンテンツのコーディングを行います。

固定ページの作り方を知りたい方はこちら

固定ページの作成
管理画面にログインして、固定ページより「お知らせ」ページを作成します。

カスタムテンプレートファイルの作成
先ほど管理画面で作成した お知らせページ用のテンプレートファイル page-news.php を作成します。

テンプレートのベースコーディング
以下のコードを page-news.php に追加します。

この時点ではまだ投稿記事は表示されません。表示されているのは、テンプレートに自分でコーディングしたデザインです。

HTML

<?php get_header(); ?>
<div class="l-main p-page">
  <!-- News -->
  <section class="p-section p-news">
    <div class="l-container--800">
      <div class="p-section__head">
        <h3 class="p-title">
          <span class="p-title--en">News</span>
          <?php the_title(); ?>
        </h3>
      </div>
      <div class="p-section__body">
        <div class="p-search bg">
          <p class="p-search__title">
            <span class="c-icon__w24 filter"></span>
            絞り込み
          </p>
          <ul class="p-search__category">
            <li class="active"><a href="<?php echo home_url(); ?>/info">すべて</a></li>
            <li><a href="" class="">お知らせ</a></li>
            <li><a href="" class="">プレスリリース</a></li>
            <li><a href="" class="">イベント</a></li>
            <li><a href="" class="">セミナー</a></li>
          </ul>
          <div class="p-search__keyword">
            <p class="p-search__keyword--title">キーワード検索</p>
            <form action="">
              <div class="u-w280">
                <input type="text" name="keyword" id="keyword" placeholder="キーワードを入力">
              </div>
              <div class="c-btnWrap">
                <button type="submit" class="c-btn c-btn__saerch c-btn__xs">検索</button>
                <a href="<?php echo home_url(); ?>/info" class="c-btn c-btn__lineWhite c-btn__xs">リセット</a>
              </div>
            </form>          
          </div>
        </div>
        <ul class="p-list">
          <li class="p-list__item">
            <a href="投稿のURLを表示"></a>
            <p class="date">投稿日を表示</p>
            <span class="c-category">カテゴリーを表示</span>
            <p class="title">投稿のタイトルを表示</p>
          </li>
          <li class="p-list__item">
            <a href="投稿のURLを表示"></a>
            <p class="date">投稿日を表示</p>
            <span class="c-category">カテゴリーを表示</span>
            <p class="title">投稿のタイトルを表示</p>
          </li>
          <li class="p-list__item">
            <a href="投稿のURLを表示"></a>
            <p class="date">投稿日を表示</p>
            <span class="c-category">カテゴリーを表示</span>
            <p class="title">投稿のタイトルを表示</p>
          </li>
        </ul>
      </div>
    </div>
  </section>
  <div class="p-bread">
    <div class="l-container--1080">
      <ul class="p-bread__list">
        <li><a href="<?php echo home_url(); ?>">Home</a></li>
        <li><span>News</span></li>
      </ul>
    </div>
  </div>
  <!-- Contact -->
  <?php get_template_part('component/_contact'); ?>
</div>
<?php get_footer(); ?>

別途、header.phpなどのAboutページに遷移するリンクを記述しておきましょう。

CSS

/* ! ==================================================
- ルート
================================================== */
:root {
  --fc-placeholder: rgba(8,6,24,.2);
  --fc-border: #D1D0DC;
}
/* ! ==================================================
- フォーム
================================================== */
input, textarea, select {
  font-size: 14px;
  width: 100%;
  height: 32px;
  padding: 2px 8px;
  border: 1px solid var(--fc-border);
  background-color: var(--white);
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
}

/* プレイスフォルダー */
::-webkit-input-placeholder { color: var(--fc-placeholder);}
:-ms-input-placeholder { color: var(--fc-placeholder);}
::-moz-placeholder { color: var(--fc-placeholder);}

/* ! ==================================================
- コンポーネント
================================================== */
/* ! --------------------------------------------------
- コンポーネント / ボタン
-------------------------------------------------- */
.c-btn__saerch {
  border-color: var(--white);
  background-color: rgba(255,255,255,.5);
  min-width: 90px;
}
.c-btn__saerch:hover {
  color: var(--base);
  background-color: var(--white);
}
.c-btn__xs{ 
  height: 32px; 
  font-size: 12px;
}

/* ! --------------------------------------------------
- コンポーネント / アイコン
-------------------------------------------------- */
[class*="c-icon"].filter{ background-image: url(public/img/icon/icon_filter.svg); }

/* ! ==================================================
- オブジェクト
================================================== */
/* ! --------------------------------------------------
- オブジェクト / 絞り込み
-------------------------------------------------- */
.p-search {
  padding: 24px;
  display: flex;
  flex-direction: column;
  gap: 16px;
  margin-bottom: 48px;
}
.p-search__title {
  font-weight: 500;
  line-height: 1.5em;
  display: flex;
  align-items: center;
  gap: 4px;
}
/* カテゴリー */
.p-search__category {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.p-search__category > li a {
  font-size: 12px;
  font-weight: 500;
  line-height: 1.5em;
  letter-spacing: .1em;
  width: fit-content;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 6px 12px;
  border: 1px solid var(--fc-border);
  background-color: var(--white);
}
.p-search__category > li a:hover {
  background-color: var(--bg);
}
.p-search__category > li.active a {
  color: var(--white);
  border-color: var(--base);
  background-color: var(--base);
  pointer-events: none;
}
/* キーワード */
.p-search__keyword {
  display: flex;
  flex-direction: column;
  gap: 0 24px;
  padding: 16px 20px;
  color: var(--white);
  background-color: var(--base);
}
.p-search__keyword::after {
  content: "";
  display: none;
  width: 1px;
  min-height: 100%;
  background-color: var(--white);
}
.p-search__keyword--title {
  color: var(--white);
  font-weight: 500;
  display: flex;
  align-items: center;
}
.p-search__keyword form {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 4px 16px;
  order: 1;
}
.p-search__keyword .c-btnWrap {
  margin: 0;
  gap: 4px;
}

@media screen and (min-width: 769px) {
  .p-search__keyword {
    flex-direction: row;
  }
  .p-search__keyword::after {
    display: block;
  }
}

/* ! ==================================================
- ユーティリティ
================================================== */
/* ! --------------------------------------------------
- ユーティリティ / 幅
-------------------------------------------------- */
.u-w50p { width: 50%; }
.u-w100p { width: 100%; }
.u-w100 { width: 100px; }
.u-w200 { width: 200px; }
.u-w280 { width: 280px; }

今回追加されたスタイルのみ記述しています。

表示の確認
ブラウザで表示を確認し、表示崩れなどがないか確認しましょう。

4. 投稿記事の表示

この時点ではまだ投稿記事は表示されていないので、管理画面で作成した投稿記事を一覧で表示できるようにします。WordPressでは、ループ処理という仕組みを使うことで、投稿記事を自動的に一覧表示させることができます。

ループ処理とは

ループ処理とは、WordPressの投稿データを自動で取り出して表示する仕組みのことです。

なぜループ処理を使うのかというと、管理画面でいくつか「投稿」を作成しただけではサイトに表示されないからです。投稿をページに表示するには「投稿を読み込んで一覧にしてね」という命令を書く必要があり、この命令を実現するのが ループ処理となります。

ループ処理の実装

投稿を取得する準備をする
最初に、WP_Query という関数を使って表示したい投稿を取得する準備をします。この時に、$args の中でどんな投稿を表示するかを条件で指定します。

<?php
 $args = array(
  'posts_per_page' => 10, // 表示する投稿の数
  'post_type' => 'post',  // 投稿タイプ(デフォルトの「post」)
  'orderby' => 'date',    // 並び順の基準(dateで投稿日時順)
  'order' => 'DESC',      // 並び順(DESCは降順、ASCは昇順)
 );
 $posts_query = new WP_Query($args); // 設定を使って投稿を取得
?>
<ul>
  <li>
    <a href="投稿のURLを表示">投稿のタイトルを表示</a>
    <p>投稿日を表示</p>
  </li>
</ul>

投稿があるかチェックする
次に、have_posts()という関数を使って、投稿が1件でもあるか確認します。この関数は、投稿があればtrue(あるよ)を返し、投稿がなければfalse(ないよ)を返します。

もし投稿がある場合はその投稿の内容を順番に表示され、投稿がない場合は「投稿はまだありません」と表示するようにします。

<?php if ($posts_query->have_posts()) : ?>
  <ul class="p-list">
    <li class="p-list__item">
      <a href="投稿のURLを表示"></a>
      <p class="date">投稿日を表示</p>
      <span class="c-category">カテゴリーを表示</span>
      <p class="title">投稿のタイトルを表示</p>
    </li>
  </ul>
<?php else : ?>
  <p>投稿はまだありません。</p> <!-- 投稿が0件の場合の表示 -->
<?php endif; ?>

投稿を1件ずつ順番に取り出して表示準備をする
whileループを使って、取得した投稿を1件ずつ順番に取り出していきます。the_post()関数を使うことで、各投稿のデータ(管理画面で登録したタイトルやURL、日付など)を取り出し、そのデータを表示する準備ができます。

<ul class="p-list">
  <?php while ($posts_query->have_posts()) : $posts_query->the_post(); ?>
    <li class="p-list__item">
      <a href="投稿のURLを表示"></a>
      <p class="date">投稿日を表示</p>
      <span class="c-category">カテゴリーを表示</span>
      <p class="title">投稿のタイトルを表示</p>
    </li>
  <?php endwhile; ?>
</ul>

投稿の内容を表示する
実際に投稿の内容を表示するためには、the_permalink() で投稿のリンク、the_title() でタイトル、the_time() で日付など、関数を使って表示させます。

<li class="p-list__item">
  <a href="<?php the_permalink(); ?>"></a>
  <p class="date"><?php the_time('Y.m.d'); ?></p>
  <span class="c-category">カテゴリーを表示</span>
  <p class="title"><?php the_title(); ?></p>
</li>

最後にリセット
ループ処理を終えたら、wp_reset_postdata() を使って、WordPressが保持している投稿のデータを元に戻します。これをしないと、他の関数(the_title() など)が誤動作することがあります。

<?php
  $args = array(
    'posts_per_page' => 10, // 表示する投稿の数
    'post_type' => 'post', // 投稿タイプ(デフォルトの「post」)
    'orderby' => 'date', // 並び順の基準(dateで投稿日時順)
    'order' => 'DESC', // 並び順(DESCは降順、ASCは昇順)
  );
  $posts_query = new WP_Query($args); // 設定を使って投稿を取得
?>
<?php if ($posts_query->have_posts()) : ?>
  <ul class="p-list">
    <?php while ($posts_query->have_posts()) : $posts_query->the_post(); ?>
      <li class="p-list__item">
        <a href="<?php the_permalink(); ?>"></a>
        <p class="date"><?php the_time('Y.m.d'); ?></p>
        <span class="c-category">カテゴリーを表示</span>
        <p class="title"><?php the_title(); ?></p>
      </li>
    <?php endwhile; ?>
  </ul>
<?php else : ?>
  <p>投稿はまだありません。</p> <!-- 投稿が0件の場合の表示 -->
<?php endif; ?>
<?php wp_reset_postdata(); ?>

表示の確認
ブラウザで表示を確認し、表示崩れなどないか確認しましょう。
サイトが正しく表示されていれば完了です。

TOPページにもお知らせ一覧があるので、同じようにループ処理を記述して表示させてみましょう。

投稿一覧ページ作成のポイント

  • ループ処理を使って投稿を表示させる
    ループ処理を使うと、投稿ごとに毎回コードを書く必要がなく、管理画面で作成した記事を自動で一覧表示できます。

ループ処理について

ループ処理の種類

ループ処理は投稿記事を表示するために使われる仕組みで、大きく分けて2種類あります。それぞれの特徴を理解して使い分けることで、コンテンツを自由に表示できるようになります。

メインループ
メインループは、WordPressが自動的に記事を順番に表示してくれる仕組みです。これを使うことで、ブログのトップページや投稿ページなどで、最新の記事が順番に表示されます。

固定ページでのメインループの使用

固定ページでは、メインループは自動で動作しません。そのため、固定ページで投稿を表示させる場合は、サブループを使う必要があります。

サブループ
サブループは、メインループとは異なり、特定の条件に合った投稿を表示するために使われます。主に投稿一覧ページで表示数や表示する投稿の絞り込みを行う際に利用します。

サブループを使用した後のデータリセット

サブループを使用した後は、必ず wp_reset_postdata() を使ってデータをリセットすることが重要です。これを行わないと、後続の関数が誤動作する可能性があります。

ループ処理に関する関数 /パラメータ

ループ処理の実装に使った関数やパラメータについて、以下で解説します。

ループ処理を構成する関数

WP_Query

WordPressに「どんな投稿を取り出したいか」を命令するための関数です。表示件数や投稿タイプなど、さまざまな条件を指定して投稿を取得できます。

指定しない場合は、WordPressの管理画面の表示設定で指定した「1ページに表示する最大投稿数」が使われます。

have_posts()

表示すべき投稿が「まだあるかどうか」をチェックするための関数です。

WordPressのループの中でよく使われ、投稿がまだ残っていれば true(あるよ)、全部表示し終えたら false(もうないよ)を返します。

the_post()

1件ずつ投稿データを読み込み、表示の準備をする(タイトル、本文、投稿日などの投稿の内容を表示できるようにする)関数です。

この関数を実行することで、ループ内で個々の投稿の情報を表示するための関数のthe_title() や the_permalink() などが正しく機能するようになります。

WP_Queryで使う主なパラメータ($args に書く条件)

posts_per_page

1ページに表示する投稿数を指定できます。
「-1」を指定すると、すべての投稿が表示されます(ページ分けなし)。

post_type

どの種類の投稿を表示するかを指定できます。
通常の投稿は、'post' と指定します(これがデフォルトです)。

orderby

投稿を並べる基準(例:date, title, modified など)を指定できます。

order

昇順(ASC)か降順(DESC)かを指定します

ループ内で個々の投稿の情報を表示するための関数

the_permalink()

投稿の個別ページへのURLを取得します(リンク先)。

the_title()

投稿のタイトルを表示します。

the_time()

投稿の日付を表示します。
フォーマットも指定できます(例:Y.m.d →「2024.04.21」)。

ループ終了後に使う補助的な関数

wp_reset_postdata()

WP_Query を使ったあと、WordPressが元々持っていた投稿情報に戻すための関数です。これを使わないと、ページ内の他のテンプレートタグ(例:the_title())が誤作動する可能性があります。

以上が「投稿一覧の作り方」の説明でした。
ループ処理は最初は難しく感じるかもしれませんが、まずは「投稿を表示させるためのコード」の型として捉えておきましょう。細かい意味はあとから少しずつ理解していけば大丈夫です。

次のステップでは、「投稿詳細の作り方」について説明していきます。

WordPress

全 13 動画
  • WordPressのダウンロード

    WordPressのダウンロード

    05:58
  • サーバーにWordPressをインストール

    サーバーにWordPressをインストール

    05:46
  • 管理画面の使い方

    管理画面の使い方

    03:41
  • フォルダ構成とオリジナルテーマの作り方

    会員限定 フォルダ構成とオリジナルテーマの作り方

    07:20
  • テンプレートファイルの分割

    会員限定 テンプレートファイルの分割

    04:55
  • 固定ページ (page.php)

    固定ページ (page.php)

    04:40
  • 固定ページの作り方

    固定ページの作り方

    04:48
  • 投稿タイプ

    会員限定 投稿タイプ

    03:26
  • 投稿一覧の作り方

    投稿一覧の作り方

    08:59
  • 投稿詳細の作り方

    投稿詳細の作り方

    03:32
  • カテゴリーとタグ

    会員限定 カテゴリーとタグ

    09:40
  • 検索機能

    会員限定 検索機能

    04:50
  • プラグインとは

    プラグインとは

    04:41