Support

Account

Home Forums General Issues Insert post WP Rest api with field text and image

Solving

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
    Postman request

    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;
            }
        }
    }
    
Viewing 3 posts - 1 through 3 (of 3 total)

The topic ‘Insert post WP Rest api with field text and image’ is closed to new replies.