Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions includes/rest-api/class-acf-rest-api.php
Original file line number Diff line number Diff line change
Expand Up @@ -231,11 +231,11 @@ public function load_fields( $object, $field_name, $request, $object_sub_type )
}

// Format the field value according to the request params.
$format = $request->get_param( 'acf_format' ) ?: acf_get_setting( 'rest_api_format' );
$value = acf_format_value_for_rest( $value, $post_id, $field, $format );
$format = $request->get_param( 'acf_format' ) ?: acf_get_setting( 'rest_api_format' );
$rest_value = acf_format_value_for_rest( $value, $post_id, $field, $format );

// We keep this one for backward compatibility with existing code that expects the field value to be.
$fields[ $field['name'] ] = $value;
$fields[ $field['name'] ] = $rest_value;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution!

Why will this fix your fatal error on the plugin? The change, as far as I can see, is just changing a variable name.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, thanks for approving the pull request.
Here is my explanation.

The original code from SCF:

// Get raw value.
$value = acf_get_value( $post_id, $field );

// First format for rest API for backward compatibility.
$value = acf_format_value_for_rest( $value, $post_id, $field, $format );

// We keep this one for backward compatibility with existing code that expects the field value to be.
$fields[ $field['name'] ] = $value;
$fields[ $field['name'] . '_source' ] = array(
'label' => $field['label'],
'type' => $field['type'],
// This line re-formats the already formatted REST value instead of the raw value, which causes issues.
'formatted_value' => acf_format_value( $value, $post_id, $field ),
);

I fixed it by renaming the formatted REST value to $rest_value and leaving the original $value untouched. This way, when calling acf_format_value() to populate the formatted_value property of _source, it’s based on the raw value, not on the already formatted value:

// Format value for rest API for backward compatibility.
$rest_value = acf_format_value_for_rest( $value, $post_id, $field, $format );

// We keep this one for backward compatibility with existing code that expects the field value to be.
$fields[ $field['name'] ] = $rest_value;
$fields[ $field['name'] . '_source' ] = array(
'label' => $field['label'],
'type' => $field['type'],
'formatted_value' => acf_format_value( $value, $post_id, $field ),
);

In my plugin (Meta Field Block), I used the 'acf/rest/format_value_for_rest' filter to change the format of the REST value to support displaying all field types (even Group, Repeater, Flexible, Relationship, etc). When SCF re-format some multi-value field types like select, it treats the altered REST value as multiple values, which is why the error occurs.

$fields[ $field['name'] . '_source' ] = array(
'label' => $field['label'],
'type' => $field['type'],
Expand Down
Loading