【WordPressテーマの作り方 第14回】一覧ページを強化!アーカイブにカスタムフィールドを表示しよう

「投稿一覧に “価格” や “会社名” を出したいけど、どう書けばいいの?」
「ACF(Advanced Custom Fields)で入力した値って、一覧にも出せるの?」

そんな疑問をもつあなたにぴったりの回です!

投稿詳細ページではすでにカスタムフィールドを使って情報を出せるようになった方も、次のステップとして「アーカイブ(一覧)にも表示させたい」という場面に必ず直面します。

今回は、以下のような場面で使える実例をたっぷり紹介します👇

  • 価格・会社名・年齢・肩書きなどを一覧カードに出したい
  • 値がないときは非表示にしたい
  • ACFの画像や繰り返し項目をスマートに扱いたい

では、さっそく始めましょう!

目次

✅ 今回のゴール

  • 投稿一覧にカスタムフィールド(価格・会社名など)を表示できる
  • ACFの値を取得して、記事カードに組み込む方法がわかる
  • ループ内での値の取り出し方・レイアウトの工夫ができるようになる

📝 ループ内でカスタムフィールドを出すには?

まずは WordPress 標準の get_post_meta() を使ったシンプルな出力方法から。

例:価格フィールドを表示

<?php if (have_posts()) : ?>
  <ul class="post-list">
    <?php while (have_posts()) : the_post(); ?>
      <li>
        <!-- 投稿のタイトルを表示 -->
        <h2><?php the_title(); ?></h2>

        <?php
        // カスタムフィールド「price」の値を取得(投稿ごとに設定されている価格)
        // 第3引数 true を指定することで「単一の値」として取得できる
        $price = get_post_meta(get_the_ID(), 'price', true);

        // 価格が設定されていれば表示(空のときは非表示)
        if ($price) :
        ?>
          <p>価格:<?php echo esc_html($price); ?>円</p>
        <?php endif; ?>
      </li>
    <?php endwhile; ?>
  </ul>
<?php endif; ?>

💡 true をつけることで、配列ではなく「単一の値」として取得できます。

※この後紹介する get_field() は、ACF(Advanced Custom Fields)プラグインが有効化されている必要があります。

get_post_meta() はWordPress標準、get_field() はACF専用関数です。ACFで登録した値を取得したい場合は get_field() を使いましょう。

🌟 ACFの値を一覧に表示したいとき

get_field() を使えば、ループ内でもACFフィールドが楽に取得できます。

例:会社名を表示(company_name)

<?php
// ACFフィールド「company_name」の値を取得(会社名など)
$company = get_field('company_name');
if ($company) :
?>
  <p>会社名:<?php echo esc_html($company); ?></p>
<?php endif; ?>

🧩 カスタム投稿タイプの一覧でもOK

たとえば archive-voice.php のようなテンプレートでも同じ構文で取得可能です。

<?php
$job = get_field('job_title');
$age = get_field('age');
?>
<p><?php echo esc_html($age); ?>歳・<?php echo esc_html($job); ?></p>

🔁 繰り返しや画像も出せる

リピーターフィールドをループで出力

<!-- ACFのリピーターフィールド「features」に値があるかチェック -->
<?php if (have_rows('features')) : ?>
  <ul>
    <?php while (have_rows('features')) : the_row(); ?>
      <?php
      // サブフィールド「item」の値を取得
      $item = get_sub_field('item');
      ?>
      <?php if ($item) : ?>
        <li><?php echo esc_html($item); ?></li>
      <?php endif; ?>
    <?php endwhile; ?>
  </ul>
<?php endif; ?>

💡画像に説明文をつけたい場合は、wp_get_attachment_image($image, 'medium', false, ['alt' => '代替テキスト']) のように alt を明示するのもおすすめです。

画像フィールドを表示

<?php
$image = get_field('company_logo');
if ($image) :
  echo wp_get_attachment_image($image, 'medium');
endif;
?>

🛠 よくある注意点

  • ACFの「フィールド名」は、設定画面の「フィールド名」タブで確認
  • 値がキャッシュされていて古い場合は、更新後に Ctrl + Shift + R で強制再読み込み
  • 値がない時は if 文で囲んで非表示にするのが基本
  • 投稿タイプが異なると get_field() は空になる → フィールドが「該当投稿タイプに紐づいているか」を確認
  • 値がないのか、そもそも設定がされていないのかを切り分けるには var_dump() などでデバッグも有効
  • ACFを使わない場合でも、カスタムフィールドの値は get_post_meta() で取得可能です。

💡 応用:構造化データに活用する

カスタムフィールドの内容を構造化データ(JSON-LD)として出力すれば、SEOにも貢献します。

<!-- 商品情報を JSON-LD 形式でマークアップ(SEO強化に有効) -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "<?php the_title(); ?>",
  "offers": {
    "@type": "Offer",
    "price": "<?php echo esc_html($price); ?>",
    "priceCurrency": "JPY"
  }
}
</script>

📝 このあたりは、今後の記事で実践形式で解説予定です!

📝 まとめ

  • アーカイブでも get_post_meta()get_field() を使えばカスタム情報を出せる
  • 値がない場合は非表示にするのがスマート
  • 画像・繰り返し・構造化データまで、ACFを活用すれば表現の幅が広がる!

🔮 次回予告

第15回では、
「一覧の並び順を自由に変えたい」「特定条件だけ抽出したい」
といった場面で役立つ、WP_Query を使ったカスタムクエリの組み方を紹介します!

💡補足:
ACFの設定方法(フィールド作成・配置・グループ化など)については、別記事で画像付きで詳しくご紹介予定です。実際の管理画面キャプチャを交えて、初心者でも迷わず導入できる構成にしますので、そちらもぜひお楽しみに!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Web制作会社勤務、業界歴10年以上。現場を走り回ってきた制作者。
これからWeb制作を学ぶ人に寄り添いながら、実務で役立つ知識をわかりやすくシェアします。
「ゼロぐらいから学べる!」をモットーに、あなたの“がんばろ”を応援します!

目次