WordPress の Advanced Custom Fields の select の選択肢を Google Spreadsheet のデータから生成する

Google Spreadsheet でデータを用意する。実際には複数列あるデータの中から QUERY 関数で必要なデータのみ抽出したシートを用意し、そのシートのデータから JSON を出力する。

Sheet ID: XXXXXXXX
Sheet Name: _sheet_name_

サンプルデータ

namekana
appleりんご
orangeみかん
bananaバナナ
strawberryいちご


Google Apps Script を書く。

//コード.gs

function getData(id, sheetName) {
	var sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName);
	var rows = sheet.getDataRange().getValues();
	var keys = rows.splice(0, 1)[0];
	return rows.map(function(row) {
		var obj = {}
		row.map(function(item, index) {
			obj[keys[index]] = item;
		});
		return obj;
	});
}

function doGet() {
	var data = getData('XXXXXXXX', '_sheet_name_');
	return ContentService.createTextOutput(JSON.stringify(data, null, 2))
	.setMimeType(ContentService.MimeType.JSON);
}

参考:Google Spreadsheet のデータを JSON 形式で取得する Web API をサクッと作る

Web app として公開する。
Execute the app as: Me
Who has access to this app: Anyone, even anonymous

//得られるデータ

[
	{
		"name":"apple",
		"kana":"りんご"
	},
	{
		"name":"orange",
		"kana":"みかん"
	},
	{
		"name":"banana",
		"kana":"バナナ"
	},
	{
		"name":"strawberry",
		"kana":"いちご"
	}
]

WordPress の functions.php に、ACF をロードした時のフィルターフックを用意し、Web app の URL を叩いて取得したデータを返す。

//functions.php

function acf_load_field( $field ){
	$url = 'https://script.google.com/macros/s/_current_web_app_url_/exec';
	$json = file_get_contents($url);
	$arr = json_decode($json,true);
	$field['choices'] = array();
	foreach ($arr as $v) {
		$field['choices'][$v['name']] = $v['kana'];
	}
	return $field;
}
add_filter('acf/load_field/name=_field_name_', 'acf_load_field');

参考:Advanced Custom Fieldsでセレクトボックスなどの選択肢を動的に設定する方法