ACF(Advanced Custom Fields)で選択肢を動的に設定する方法


Advanced Custom Fieldsで作ったセレクトボックスに特定の記事のタイトルを入れることがあったので
その方法をメモしておきます。

Advanced Custom Fieldsとは

Advanced Custom Fields (ACF) は、WordPressのカスタムフィールドを簡単に拡張できる人気のプラグインです。 ACFを使うと、投稿やページ、カスタム投稿タイプに独自のデータ入力フィールドを追加し、柔軟に管理できます。
例えば、不動産サイトで物件の情報をまとめるとき、ACFを使えば「価格」「所在地」「最寄り駅」などの専用フィールドを直感的に追加できます。 さらに、単なるテキストだけでなく、画像、日付、選択リスト、URLなどさまざまなデータ形式に対応しています。
開発者にとっても便利なのは、専用のPHP関数(例:get_field()やthe_field())でフィールドの値を簡単に呼び出せること。 これにより、テーマのテンプレートにデータをスムーズに組み込むことができ、カスタマイズも容易です。 また、有料の「ACF Pro」では、さらに柔軟な「リピーターフィールド」や「フレキシブルコンテンツ」なども追加できるため、複雑なデータ構造にも対応可能です。

function.phpでセレクトボックスに選択肢を設定する方法

下記のPHPは、カスタムフィールドの内容をフィルターで変更する基礎のコードになります。
function.phpに下記のPHPを書くことで、selectボックスに好きな値を入力できます。
動的に記事名を出せるように下記のコードを修正していきます。

function acf_test_field_choices( $field ) {
    
    $field['choices'] = array(); // 選択肢を初期化
    $field['choices']['値1'] = 'ラベル1'; // 選択肢を設定
    $field['choices']['値2'] = 'ラベル2'; // 選択肢を設定
    return $field;
}
add_filter('acf/load_field/name=カスタムフィールド名', 'acf_test_field_choices');

add_filterに取得したいフィールドを設定します。
フィールド名で設定する場合は、「acf/load_field/name=カスタムフィールド名」を設定し、
フィールドKeyで指定する場合は、「acf/load_field/key=field_からはじまるKey」を設定します。
ここで取得したフィールド内容が、$fieldに入ります。

動的にセレクトボックスに記事のタイトルを入れる方法

それでは、先程のPHPを踏まえて、記事タイトルを動的に表示できるようにしていきます。

function acf_test_field_choices( $field ) {
	global $post;
	$org_post = $post; // グローバル変数$postの初期情報を格納
		$field['choices'] = array(); // 選択肢を初期化

		$query = new WP_Query(array(
			'cat' => タイトルを表示したいカテゴリーのID,
			'posts_per_page' => -1,
			'post_status' => 'publish',
		));

		if ($query->have_posts()) {
			while ($query->have_posts()) {
				$query->the_post();
				$field['choices'] = get_the_title();
			}
		}
		$post = $org_post; // グローバル変数$postを初期化
		wp_reset_postdata();
	return $field;
}
add_filter('acf/load_field/name=カスタムフィールド名', 'acf_test_field_choices');

私が記事タイトルを動的に表示できるセレクトボックスを実装した際、
ACFの内容が空になってしまうトラブルに見舞われました。
どうやら、acf/load_fieldフィルターを使用した際、
wp_reset_postdata();が効かなくなってしまうバグ?仕様?があるようです。

そのため、最初にグローバル変数$postを取得して、一旦保存しておき、
最後に上書きする形でグローバル変数$postを初期化しています。

詳細:wp_reset_postdata と acf/load_field の問題 – ACF サポート

トラックバックURL