最初に作ったやつ
グループフィールドや繰り返しフィールドにも対応。
ただし未作成のフィールドに対しては効果を発揮しない。
/**
*フィールド名と投稿IDから現在保存しようとしているACFのvalueを取得
*対象フィールドが存在しない場合(非アクティブ要素・通常の作成とは違うルートで作られた投稿など)は利用不可
*/
function get_new_acf_value( $target_field_arr, $target_id = null ){
if( empty( $_POST['acf'] ) || !$target_id ){
return "";
}
$get_input_value = $_POST['acf']; // 保存前のACFフィールドデータ
/*$target_field_arrは、繰り返しフィールドの場合はrowはrow-1 row-2のように文字列をkeyに持つ*/
$target_field_txt = "";
foreach( (array)$target_field_arr as $target_field_name ){
if( empty( $target_field_txt )){
$target_field_txt = $target_field_name;
}else{
$target_field_txt .= "_" . $target_field_name;
}
$field_key = ( !empty( get_field_object( $target_field_txt, $target_id )["key"] )) ? get_field_object( $target_field_txt, $target_id )["key"] : '';
if( !$field_key ){
//リピーターフィールド等のrowの添え字は$_POST['acf']のインデックスに使用されている[row-*]に変換してキーとして通す
//https://support.advancedcustomfields.com/forums/topic/how-to-get-the-sub-field-key-name
$field_key = "row-" . $target_field_name;
}
//$_POST['acf']['field_*************']['field_*************']と繋げていく
//$_POST['acf']では繰り返しフィールドなどの場合はkeyの前に添え字が[row-0]にように入る。
if( $field_key && !empty( $get_input_value[$field_key] )){
$get_input_value = $get_input_value[$field_key];
if( !isset( $get_input_value_check )){
$get_input_value_check = true;
}
}else{
$get_input_value_check = false;
}
}
$return_data = ( $get_input_value_check === true ) ? $get_input_value : "";
//return (string)$return_data;
return $return_data;
}
未作成フィールドに対応させたやつ
get_field_object()の代わりにACF独自のacf_get_field()を使えば未作成フィールドが対象でもエラー出さなかったっぽいので改造。
とりあえず使えたけどあまり検証していないので使う場合は再確認必要。
/**
*フィールド名と投稿IDから現在保存しようとしているACFのvalueを取得
*非アクティブフィールドでも取得できるバージョン
*get_field_object()の代わりにacf_get_field()を利用するように変えた。
*/
function get_new_acf_value_ex( $target_field_arr, $target_id = null ){
if( empty( $_POST['acf'] ) || !$target_id ){
return "";
}
$get_input_value = $_POST['acf']; // 保存前のACFフィールドデータ
/*$target_field_arrは、繰り返しフィールドの場合はrowはrow-1 row-2のように文字列をkeyに持つ*/
$target_field_txt = "";
foreach( (array)$target_field_arr as $target_field_name ){
$field_key = acf_get_field( $target_field_name, $target_id )["key"];
if( !$field_key ){
//リピーターフィールド等のrowの添え字は$_POST['acf']のインデックスに使用されている[row-*]に変換してキーとして通す
//https://support.advancedcustomfields.com/forums/topic/how-to-get-the-sub-field-key-name
$field_key = "row-" . $target_field_name;
}
//$_POST['acf']['field_*************']['field_*************']と繋げていく
//$_POST['acf']では繰り返しフィールドなどの場合はkeyの前に添え字が[row-0]にように入る。
if( $field_key && !empty( $get_input_value[$field_key] )){
//非アクティブ要素なので存在しない場合がある
if( !isset( $get_input_value[$field_key] )){
$get_input_value_check = false;
break;
}else{
$get_input_value = $get_input_value[$field_key];
}
if( !isset( $get_input_value_check )){
$get_input_value_check = true;
}
}else{
$get_input_value_check = false;
}
}
//取得できない場合はfalseを返す
$return_data = ( $get_input_value_check === true ) ? $get_input_value : false;
//return (string)$return_data;
return $return_data;
}