WordPressでカスタムフィールドを作成できる「Advanced Custom Fields」には、同じ入力項目を何行も追加できる繰り返しフィールドがあります。
ただし、ACF公式の繰り返しフィールドはPro版限定の機能です。
料金表、スタッフ一覧、FAQ、商品一覧などを作るためだけにACF Proを導入するか、迷うこともあると思います。
今回は、ACF無料版に繰り返しフィールドの拡張プラグインを追加して、無料で繰り返しフィールドを作成してみました。
さらにCode Snippetsでショートコードを登録し、固定ページに料金表を表示するところまで解説します。

今回作成する料金表は、次の3項目で構成します。
- プラン名
- 料金
- 説明
複数の料金プランを、管理画面から自由に追加、削除できるようにします。
ACFで料金表フィールドを作成する
WordPress管理画面から、次の順に画面を開きます。
- ACF
- フィールドグループ
- 新規追加
フィールドグループ名は、分かりやすく「料金表」としました。

最初に、親となる繰り返しフィールドを作成します。
- フィールドラベル:料金表
- フィールド名:
price_list - フィールドタイプ:Extended Repeater(拡張繰り返しフィールド)

今回のサンプルコードでは、フィールド名をprice_listとして使用します。
フィールド名を変更した場合は、後ほど紹介するPHPコード内のフィールド名も合わせて変更してください。
繰り返し内の項目を作成する
Extended Repeaterの中に、次の3項目を追加します。
1つ目はプラン名です。
- フィールドラベル:プラン名
- フィールド名:
plan_name - フィールドタイプ:テキスト
2つ目は料金です。
- フィールドラベル:料金
- フィールド名:
price - フィールドタイプ:テキスト
料金フィールドを数値ではなくテキストにしているのは、次のような表記も入力できるようにするためです。
- 月額 9,800円
- 初期費用無料
- お問い合わせ
3つ目は説明です。
- フィールドラベル:説明
- フィールド名:
description - フィールドタイプ:テキストエリア
最終的なフィールド構成は、次のようになります。


フィールドの表示ルールを設定する
続いて、フィールドグループの表示ルールを設定します。
固定ページで料金表を入力する場合は、次のように指定します。
- 投稿タイプ
- 等しい
- 固定ページ
料金表専用の固定ページだけに表示したい場合は、ページを個別に指定することもできます。

設定が完了したら、フィールドグループを保存します。
料金表のサンプルデータを入力する
料金表を表示したい固定ページを編集します。
編集画面の下部などに、「料金表」の入力欄が表示されます。
テスト用として、次の3行を登録しました。

1行目はライトプランです。
- プラン名:ライトプラン
- 料金:月額 9,800円
- 説明:小規模事業者向けの基本プランです。
2行目はスタンダードプランです。
- プラン名:スタンダードプラン
- 料金:月額 19,800円
- 説明:更新サポートや基本的な改善対応を含む標準プランです。
3行目はプレミアムプランです。
- プラン名:プレミアムプラン
- 料金:月額 39,800円
- 説明:優先サポートと継続的なサイト改善を含む上位プランです。
入力が終わったら、固定ページを更新します。
Code Snippetsでショートコードを作成する
次に、料金表を表示するショートコードを作成します。
WordPress管理画面からCode Snippetsを開き、新しいPHPスニペットを追加します。
スニペット名は「ACF料金表ショートコード」としました。
Code Snippetsのコード入力欄には、通常<?phpを付けずに入力します。
以下のコードを貼り付けてください。
/**
* 料金表ショートコード
*
* 使用例
* [price_table]
*
* 別ページの料金表を表示する場合
* [price_table post_id="123"]
*/
function motoki_price_table_shortcode( $atts ) {
$atts = shortcode_atts(
array(
'post_id' => get_the_ID(),
),
$atts,
'price_table'
);
$post_id = absint( $atts['post_id'] );
if ( ! function_exists( 'get_field' ) ) {
return '';
}
$rows = get_field( 'price_list', $post_id );
if ( empty( $rows ) || ! is_array( $rows ) ) {
return '';
}
ob_start();
?>
<div class="motoki-price-table">
<?php foreach ( $rows as $row ) : ?>
<?php
$plan_name = isset( $row['plan_name'] )
? $row['plan_name']
: '';
$price = isset( $row['price'] )
? $row['price']
: '';
$description = isset( $row['description'] )
? $row['description']
: '';
?>
<div class="motoki-price-item">
<?php if ( $plan_name !== '' ) : ?>
<h3 class="motoki-price-title">
<?php echo esc_html( $plan_name ); ?>
</h3>
<?php endif; ?>
<?php if ( $price !== '' ) : ?>
<div class="motoki-price-value">
<?php echo esc_html( $price ); ?>
</div>
<?php endif; ?>
<?php if ( $description !== '' ) : ?>
<div class="motoki-price-description">
<?php
echo wp_kses_post(
wpautop( $description )
);
?>
</div>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
<?php
return ob_get_clean();
}
add_shortcode(
'price_table',
'motoki_price_table_shortcode'
);スニペットの実行場所は「サイト全体で実行」にします。
保存後、スニペットを有効化してください。
最後に固定記事を開いて確認しましょう。

固定ページにショートコードを設置する
料金表を表示したい固定ページに、ショートコードブロックを追加します。
ショートコードブロックには、次のコードを入力します。
[price_table]固定ページを更新して表示すると、ACFで入力した料金表が出力されます。
料金表のCSSを追加する
PHPだけでも料金表の内容は表示されますが、見た目は通常のテキストに近い状態です。
料金表らしいデザインにするため、次のCSSを追加します。
SWELLの場合は、追加CSSやCSS Editorなどに入力できます。
/* 料金表全体 */
.post_content .motoki-price-table {
width: 100%;
margin: 2rem 0;
overflow: hidden;
border: 1px solid #d8dde5;
border-radius: 8px;
background: #fff;
}
/* 見出し行 */
.post_content .motoki-price-header {
display: grid;
grid-template-columns: 1.2fr 1fr 2fr;
background: #26384a;
color: #fff;
font-size: 14px;
font-weight: 700;
}
.post_content .motoki-price-header > div {
padding: 13px 20px;
border-right: 1px solid rgba(255, 255, 255, 0.25);
}
.post_content .motoki-price-header > div:last-child {
border-right: 0;
}
/* 料金表の1行 */
.post_content .motoki-price-item {
display: grid;
grid-template-columns: 1.2fr 1fr 2fr;
margin: 0;
padding: 0;
border-bottom: 1px solid #d8dde5;
background: #fff;
}
.post_content .motoki-price-item:last-child {
border-bottom: 0;
}
/* セル共通 */
.post_content .motoki-price-title,
.post_content .motoki-price-value,
.post_content .motoki-price-description {
box-sizing: border-box;
display: flex;
align-items: center;
min-width: 0;
margin: 0;
padding: 18px 20px;
border-right: 1px solid #d8dde5;
line-height: 1.7;
}
/* プラン名 */
.post_content .motoki-price-title {
font-weight: 700;
color: #222;
background: #f5f7fa;
}
/* 料金 */
.post_content .motoki-price-value {
justify-content: center;
color: #1268b3;
font-size: 17px;
font-weight: 700;
text-align: center;
white-space: nowrap;
}
/* 説明 */
.post_content .motoki-price-description {
display: block;
border-right: 0;
color: #333;
font-size: 15px;
}
/* 説明文の余白調整 */
.post_content .motoki-price-description p {
margin: 0;
padding: 0;
}
/* スマートフォン */
@media screen and (max-width: 767px) {
.post_content .motoki-price-table {
overflow: visible;
border: 0;
border-radius: 0;
background: transparent;
}
.post_content .motoki-price-header {
display: none;
}
.post_content .motoki-price-item {
display: block;
overflow: hidden;
margin-bottom: 20px;
border: 1px solid #d8dde5;
border-radius: 8px;
}
.post_content .motoki-price-item:last-child {
border-bottom: 1px solid #d8dde5;
}
.post_content .motoki-price-title,
.post_content .motoki-price-value,
.post_content .motoki-price-description {
display: block;
width: 100%;
padding: 14px 16px;
border-right: 0;
border-bottom: 1px solid #d8dde5;
text-align: left;
}
.post_content .motoki-price-value {
font-size: 18px;
}
.post_content .motoki-price-description {
border-bottom: 0;
}
}パソコンでは、プラン、料金、内容の横3列として表示されます。
スマートフォンでは横幅が狭くなるため、プランごとのカード形式に切り替わります。
別の固定ページに登録した料金表を表示する
通常の[price_table]は、ショートコードを設置したページに登録されている料金表を取得します。
別の固定ページに登録した料金表を表示する場合は、投稿IDを指定します。
[price_table post_id="123"]123の部分を、料金表を登録した固定ページのIDに変更してください。
この方法を使うと、料金表を管理するページと、実際に表示するページを分けることができます。
複数ページで共通の料金表を表示したい場合にも便利です。
以下、有料部分になります。



