WordPress│ACF無料版で繰り返しフィールドを使う方法

WordPressでカスタムフィールドを作成できる「Advanced Custom Fields」には、同じ入力項目を何行も追加できる繰り返しフィールドがあります。

ただし、ACF公式の繰り返しフィールドはPro版限定の機能です。

料金表、スタッフ一覧、FAQ、商品一覧などを作るためだけにACF Proを導入するか、迷うこともあると思います。

今回は、ACF無料版に繰り返しフィールドの拡張プラグインを追加して、無料で繰り返しフィールドを作成してみました。

ACFにはサードパーティーがフィールドタイプを追加できる設計があり、そこへ独自フィールドを登録しています。

もう少し詳細に書くと、ACF無料版には、テキストや画像などの既存フィールドだけでなく、外部プラグインが独自のフィールドタイプを登録できる拡張機構があります。

その仕組みを使って独自フィールドタイプをACFへ追加しています。

ACF Pro純正のRepeaterとは異なる独自フィールドです。
既存のACF Pro用コードとの完全互換性や、将来的なデータ移行は保証されません。

さらにCode Snippetsでショートコードを登録し、固定ページに料金表を表示するところまで解説します。

今回作成する料金表は、次の3項目で構成します。

  • プラン名
  • 料金
  • 説明

複数の料金プランを、管理画面から自由に追加、削除できるようにします。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

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に変更してください。

この方法を使うと、料金表を管理するページと、実際に表示するページを分けることができます。

複数ページで共通の料金表を表示したい場合にも便利です。

以下、有料部分になります。

実際のプラグインも紹介

  • URLをコピーしました!

WAZAの有料記事のサブスクリプションも開始しました。

サービス

Service

WordPressサイトのカスタマイズのサービスに関心がありましたら、ぜひ詳細をご覧ください。

目次