WordPress

【ACF無料版】リピートフィールド代替方法!カスタム投稿タイプで代用する手順とPHPコード解説

ACF無料版ではリピートフィールドが使えず困っていませんか?

・無料で実装できないのか?
・代替方法はないのか?
・できればコードも知りたい

本記事では、ACF無料版でもリピートフィールドのような構造を実現する方法を、カスタム投稿タイプを使って解説します。

ACF無料版でリピートフィールドを代用する仕組み

有料版の「リピートフィールド」は、1つのページの中に複数のデータ行を作成します。 一方、今回紹介する代用案は、「Q&A」という専用の投稿タイプを1つの大きな「箱」と見なす方法です。

ACF無料版でカスタム投稿タイプをリピートフィールドの代わりにする仕組みの図解
  1. 箱を作る: カスタム投稿タイプで「Q&A」という型を作成します。
  2. 中身を入れる: 1つの質問ごとに1つの「投稿」を作成し、そこにACFのフィールド(質問・回答)を入力します。
  3. 並べて表示する: プログラム(PHP)の力で、バラバラの投稿を1箇所に呼び出して結合します。

この仕組みを使うことで、ACF Pro(年間49ドル〜)を契約することなく、実質的に無限のリスト項目を作成・管理できるようになります。

この実装方法のメリットと運用の注意点(デメリット)

メリット

  • 完全無料: 年間$49(約7,500円〜)のライセンス料を節約できる
  • データの再利用: 投稿として独立しているため、サイドバーや別ページでも呼び出しが容易

デメリット

  • 管理画面の煩雑化: 1つの項目ごとに1投稿作成するため、件数が多いと管理が大変
  • 並び替えの弱さ: ACF Proのように直感的なドラッグ&ドロップができない

向いているケース・向かないケース

  • 向いている人: Q&A、スタッフ紹介、実績一覧など、項目が定型化されている場合
  • 向いていない人: ページごとに全く異なる入力項目を、自由な順番で並び替えたい場合(この場合は有料版推奨)
比較項目有料版
(リピートフィールド)
今回の代替案
(カスタム投稿)
コスト年間 $49〜0円(完全無料)
編集のしやすさ1画面で完結(◎)1つずつ投稿が必要(△)
並び替えドラッグ&ドロップ(◎)日付や追加プラグイン(△)
データの再利用基本そのページのみ(△)他ページでも呼び出せる(◎)

このように、無料で実装できる代わりに「管理のしやすさ」は劣ります。
どちらを優先するかで選択が変わります。

実装手順

今回のゴール:固定ページに「Q&A」を作成

簡易的なQ&Aを作成します。新規投稿すると、Q&A欄に追加されていくようなイメージです。

QアンドA欄の完成図

ステップ1:カスタム投稿タイプ作成

プラグインを追加から「Advanced Custom Fields」をダウンロードし、有効化します。

プラグインACFのインストール画面

サイドバーに「ACF」が追加されました。
クリックしましょう。

投稿タイプを選択し、[+新規追加]から新しい投稿タイプを作成します。

複数ラベル:Q&A

単数ラベル:Q&A

投稿タイプキー:question-and-answer

複数ラベルと単数ラベルの違いは、

単数ラベル:1件を指す表示用
複数ラベル:一覧・集合を指す表示用

です。

例えば英語では

複数ラベル:Products

単数ラベル:Product

のように明確に使い分けるため、その名残として分かれています。が、日本語では同じ文言でOKです。

今回使用する「投稿タイプキー」はPHPで記述する際に使用していきます。PHPとフィールドグループで異なったフィールド名を使うとエラーが出ますので、ハイフンやアンダーバーなど間違えないように気を付けましょう。

入力できたら右上[変更内容を保存]を押します。

投稿タイプ一覧に「Q&A」が追加されました。

サイドバーに「Q&A」が表示されました。
これで投稿タイプの設定は完了です。

ステップ2:ACFで入力項目(フィールド)を設定する

サイドバー「ACF」からフィールドグループを[+新規追加]していきます。

フィールドグループタイトルは「Q&A」とします。

フィールドタイプ:テキスト

フィールドラベル:質問

フィールド名:question

入力できたら[閉じて新しいフィールドを追加]をクリックします。

今回使用する「フィールド名」はPHPで記述する際に使用していきます。PHPとフィールドグループで異なったフィールド名を使うとエラーが出ますので、ハイフンやアンダーバーなど間違えないように気を付けましょう。

フィールドタイプ:テキストエリア

フィールドラベル:回答

フィールド名:answer

入力できたら[フィードを閉じる]をクリックします。

フィールド下にある設定です。

ルールを

投稿タイプ 等しい Q&A にします。

先ほど作成した投稿タイプです。

選択できたら、右上の[変更内容を保存]を押して登録します。

作成したフィールドグループが追加されていればOKです。

これで下準備は完了しました!いよいよ情報を入力していきます。

先ほど作成した投稿タイプを選択して、[新規Q&Aを追加]をクリックします。

今回は3件のQ&Aを追加してみます。

画面下部に、フィールドグループ「Q&A」が生成されていると思います。

質問と回答を入力していきましょう。

入力できたら右上の[公開]をクリックして公開してください。

1件目

2件目

3件目

3件作成した状態です。

ステップ3:PHPコードで固定ページに表示させる実装手順

現時点では、まだ、データを入力したのみで表示できていません。
編集画面で入力したデータを固定ページに表示させるようにします。

表示したい固定ページが決まっている場合は、そのページのPHPが書ければ問題ないです。

今回は固定ページを新規作成し、PHPの紐づけを行いました。

PHPと固定ページを紐づける方法はいくつかありますが、スラッグを使っています。

固定ページの右上、「スラッグ」を、今回は「acf_repeat」にします。
変更できたらページを公開しましょう。

使用しているテーマ(推奨:子テーマ)配下に「page-acf_repeat.php」を作成します。

(例えばスラッグを「abc」にしたら、php名は「page-abc.php」、
スラッグを「fashion」にしたら、php名は「page-fashion.php」となります。)

PHPのコード

<?php

get_header();

// WP_Queryの引数を設定
$args = [
  'post_type'      => 'question-and-answer',
  'posts_per_page' => -1,
  'orderby'        => 'date',
  'order'          => 'ASC',
];

// クエリを実行
$query = new WP_Query($args);

// 投稿が存在する場合のみ処理
if ($query->have_posts()):
?>
<div class="qa-list">
  // ループ開始
  <?php while ($query->have_posts()): $query->the_post();

// 管理画面で作成したカスタムフィールド「question」の値を取得
    $question = get_field('question');

// 管理画面で作成したカスタムフィールド「answer」の値を取得
    $answer   = get_field('answer');
  ?>

    <details class="qa-item">
      <summary class="qa-question">
        // 質問文を出力
        // esc_html()でHTMLエスケープ
        <?php echo esc_html($question); ?>
      </summary>
      <div class="qa-answer">
        // 回答文を出力
        <?php echo wpautop(esc_html($answer)); ?>
      </div>
    </details>

  <?php endwhile; ?>
</div>
<?php
// ループ後にグローバル$postを元に戻す(重要)
wp_reset_postdata();
endif;

get_footer();

固定ページを読み込むと、データが表サイトに表示されました。
このままだと見にくいので、少しだけCSSも書いていきましょう。

.qa-list{
  width: 50%;
  margin: 5rem auto;
}
.qa-item {
  border-bottom: 1px solid #ddd;
  padding: 10px 0;
}

.qa-question {
  cursor: pointer;
  font-weight: bold;
  position: relative;
  padding-right: 30px;
  list-style: none;
}

/* デフォルトの三角アイコンを消す */
.qa-question::-webkit-details-marker {
  display: none;
}

.qa-question::after {
  content: '+';
  position: absolute;
  right: 0;
  top: 0;
}

details[open] .qa-question::after {
  content: '-';
}

.qa-answer {
  margin-top: 10px;
}

[▶]が消えて、[+]ボタンができました。

クリックするときちんと回答が表示されます。

簡易的なQ&Aのため、より整える場合はjavascriptなどで制御するのが望ましいです。

ついでに、投稿を増やしても問題なく表示されるか確認しましょう。

先ほどと同じ手順で「服装は自由ですか」を追加・公開しました。

再読み込みするときちんと表示されました。

表示自体はこれで完成です。

実装のポイント(エラー回避・注意点)

フィールド名の一致について(最重要)

ACFの設定画面で決めた『フィールド名』と、PHPコード内の get_field('○○') が1文字でも違うと表示されません。特にアンダーバーとハイフンの打ち間違いはよくあるミスです。

wp_reset_postdata() の重要性

ループの最後にある wp_reset_postdata(); を忘れると、その後のページの表示が崩れたり、サイドバーが正しく表示されなかったりします。

データの並び順について

カスタム投稿タイプで代用する場合、標準では『投稿日順』に並びます。任意の順番にしたい場合は、プラグイン(Post Types Orderなど)を併用するか、ACFに『並び順用』の数値フィールドを追加する必要があります。

posts_per_page = -1 の注意点

全件取得するため、投稿数が増えるとページ表示が重くなる可能性があります。
件数が多い場合はページネーションや件数制限を検討してください。

まとめ:ACF Proにアップグレードすべきタイミングとは?

ACF無料版でも、カスタム投稿タイプを活用することで、
リピートフィールドのような「繰り返し構造」は十分再現可能です。

ただし、この方法は万能ではありません。

■ この方法がおすすめな人
・Q&Aや用語集など、同じ構造のデータを増やしたい
・複数ページでデータを使い回したい
・コストをかけずに実装したい

■ ACF Proを検討すべき人
・1ページ内で自由に並び替えたい
・レイアウトごとに柔軟に構造を変えたい
・管理画面の操作性を重視したい

「データ管理のしやすさ」を取るか、
「編集画面の直感性」を取るかが判断基準になります。

まずは無料で構築してみて、運用が煩雑に感じたタイミングで
ACF Proへ移行するのがおすすめです。

ACF公式サイト https://www.advancedcustomfields.com/pro/

TOP