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

    • Zek

    • September 12, 2019 at 1:41 am

    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 ?

    • Zek

    • September 12, 2019 at 4:33 pm

    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;
            }
        }
    }
    • Zek

    • September 12, 2019 at 9:48 pm

    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)

You must be logged in to reply to this topic.

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.