情境是我幫客戶設計了一個區塊小工具來取得文章列表,而這小工具我是用 ACF 設計的,裡面有很多篩選欄位,可以想像成是把 WP_Query
做成使用者介面這樣,篩選條件是以文章的 Taxonomy 為主,下拉選單的內容則是 Terms,因此客戶可以用這小工具篩選出他需要的列表。
但棘手的點在於這個小工具要撈的文章列表並沒有存在於網站本身,而是要透過其他網站而來,再加上文章來源站的 Terms 會時常變動,因此除了文章以外,連 Taxonomy 的 Terms 也就是下拉選單的 Option 也必須要透過 API 來取得,並且在載入小工具時會自動重新抓取最新的分類項目。
還好 ACF 有提供勾點 acf/load_field/name=my_select_field
來設定當欄位載入時修改選項的內容,該勾點提供一個參數 $field
,是欄位內容的陣列,如果這個欄位是下拉選單,就可以用 choices
這個 key
來設定 Option,因此只要把 API 開好,把拿到的資料以 key value 的方式存進去 $field['choices']
裡面即可。
具體實作如下:
<?php
function set_my_select_option( $field ) {
$field['choices'] = array();
$options = array(
'method' => 'GET',
'timeout' => 60,
'headers' => array(
'Content-Type' => 'application/json',
),
);
$response = wp_remote_request( 'https://site.com/wp-json/wp/v1/get-terms', $options );
$terms = json_decode( wp_remote_retrieve_body( $response ) );
foreach ( $terms as $key => $value ) {
$field['choices'][ $key ] = $value;
}
return $field;
}
add_filter( 'acf/load_field/name=my_select_field', 'set_my_select_option' );