Google Spreadsheet でデータを用意する。実際には複数列あるデータの中から QUERY 関数で必要なデータのみ抽出したシートを用意し、そのシートのデータから JSON を出力する。
Sheet ID: XXXXXXXX
Sheet Name: _sheet_name_
サンプルデータ
| name | kana |
|---|---|
| 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');