Home › Forums › General Issues › Insert post WP Rest api with field text and image
Hello,
I try to insert a post with REST API who contain acf field text and image in one api call.
My image is an acf field.
I register my field like that:
register_rest_field( 'project', 'logo', array(
'get_callback' => 'get_field_logo',
'update_callback' => 'update_field_logo',
)
);
register_rest_field( 'project', 'headline', array(
'get_callback' => 'get_field_headline',
'update_callback' => 'update_field_headline',
)
);
I send my request via Postman
update_field_headline
is correctly call, but update_field_logo
is never call.
I try to debug wp-includes/rest-api/endpoints/class-wp-rest-controller.php
on line 421 is see:
// Don't run the update callbacks if the data wasn't passed in the request.
if ( ! isset( $request[ $field_name ] ) ) {
continue;
}
I think update_field_logo
is never call because “logo” is not set inside $_POST variable but inside $_FILES variable. So in line 421 the field is skipped.
If I modifiy the core file on line 421 like below everythings work well
if ( ! isset( $request[ $field_name ] ) && ! isset($_FILES[ $field_name ] ) {
continue;
}
But modify WordPress Core file is not a solution…
Any idea how can I allow files to be trigger on update_callback ?
I found a solution but i’m sure there is a better way.
I add an action on rest_insert_<post_type>
hook
add_action( 'rest_insert_project', 'prefix_update_files_field', 10 , 3 );
function update_files_field($post, $request, $true){
global $wp_rest_additional_fields;
$my_post_type = 'project';
$additional_fields = $wp_rest_additional_fields[$my_post_type];
foreach ( $additional_fields as $field_name => $field_options ) {
if ( ! $field_options['update_callback'] ) {
continue;
}
// Don't run the update callbacks if the data wasn't passed in the request.
if ( ! isset($_FILES[ $field_name ] ) ) {
continue;
}
$result = call_user_func( $field_options['update_callback'], $request[ $field_name ], $object, $field_name, $request, $my_post_type );
if ( is_wp_error( $result ) ) {
return $result;
}
}
}
Some error on my response, this is a correct code:
add_action( 'rest_insert_project', 'prefix_update_files_field', 10 , 3 );
function prefix_update_files_field($post, $request, $true){
global $wp_rest_additional_fields;
$my_post_type = 'project';
$additional_fields = $wp_rest_additional_fields[$my_post_type];
foreach ( $additional_fields as $field_name => $field_options ) {
if ( ! $field_options['update_callback'] ) {
continue;
}
// Don't run the update callbacks if the data wasn't passed in the request.
if ( ! isset($_FILES[ $field_name ] ) ) {
continue;
}
$result = call_user_func( $field_options['update_callback'], $_FILES[ $field_name ], $object, $field_name, $request, $my_post_type );
if ( is_wp_error( $result ) ) {
return $result;
}
}
}
You must be logged in to reply to this topic.
Welcome to the Advanced Custom Fields community forum.
Browse through ideas, snippets of code, questions and answers between fellow ACF users
Helping others is a great way to earn karma, gain badges and help ACF development!
We’re hard at work on ACF 6.1, and Beta 1 is now available 🚀
— Advanced Custom Fields (@wp_acf) March 16, 2023
This release includes custom post type and taxonomy registration, an improved experience when selecting field types, PHP 8.1 and 8.2 compatibility, and more!
Let’s take a look 🧵https://t.co/Y0WcAT11l4
© 2023 Advanced Custom Fields.
We use cookies to offer you a better browsing experience, analyze site traffic and personalize content. Read about how we use cookies and how you can control them in our Cookie Policy. If you continue to use this site, you consent to our use of cookies.