Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to upload an image on ACF with update_field on wordpress

I have a form, which has an upload ($_FILES['watch_photo']) field.

I have looked around and came to put this function together.

It basically takes all relevant information so it is re-usable in the future, it will return an array of the $pid, and URL of the file, when it is done.

The problem is that ACF has not provided much information how to add images to it's fields using update_field() http://www.advancedcustomfields.com/resources/functions/update_field/

function my_update_attachment($f,$pid,$t='',$c='') {
  wp_update_attachment_metadata( $pid, $f );
  if( !empty( $_FILES[$f]['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $file = wp_handle_upload( $_FILES[$f], $override );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $file_type = wp_check_filetype($_FILES[$f]['name'], array(
      'jpg|jpeg' => 'image/jpeg',
      'gif' => 'image/gif',
      'png' => 'image/png',
    ));
    if ($file_type['type']) {
      $name_parts = pathinfo( $file['file'] );
      $name = $file['filename'];
      $type = $file['type'];
      $title = $t ? $t : $name;
      $content = $c;

      $attachment = array(
        'post_title' => $title,
        'post_type' => 'attachment',
        'post_content' => $content,
        'post_parent' => $pid,
        'post_mime_type' => $type,
        'guid' => $file['url'],
      );

      foreach( get_intermediate_image_sizes() as $s ) {
        $sizes[$s] = array( 'width' => '', 'height' => '', 'crop' => true );
        $sizes[$s]['width'] = get_option( "{$s}_size_w" ); // For default sizes set in options
        $sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options
        $sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options
      }

      $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes );

      foreach( $sizes as $size => $size_data ) {
        $resized = image_make_intermediate_size( $file['file'], $size_data['width'], $size_data['height'], $size_data['crop'] );
        if ( $resized )
          $metadata['sizes'][$size] = $resized;
      }

      $attach_id = wp_insert_attachment( $attachment, $file['file'] /*, $pid - for post_thumbnails*/);

      if ( !is_wp_error( $id )) {
        $attach_meta = wp_generate_attachment_metadata( $attach_id, $file['file'] );
        wp_update_attachment_metadata( $attach_id, $attach_meta );
      }

      return array(
        'pid' =>$pid,
        'url' =>$file['url']
      );
      // update_post_meta( $pid, 'a_image', $file['url'] );
    }
  }
}

and then I used the following code:

  • to create a post and then
  • upload then use my_update_attachment to process the image
  • and finally update the advanced custom field

The code:

$args= array(   'post_type' => 'watches',       'post_status' => 'publish'    );

$watch = wp_insert_post($args);
$att = my_update_attachment('watch_image',$watch);
update_field('field_512e085a9372a',$att['url'],$watch);

What am I missing? any help would be greatly appreciated.

like image 845
Lee Proctor Avatar asked Mar 26 '13 13:03

Lee Proctor


People also ask

How do you add an image to a field in ACF?

In ACF (Advanced Custom Fields), you can add a custom field. To add an image, you can select the Field Type as "Image". In this demo, we added an image with field name home_image . In the Field Group Location, make sure to show the field group to your custom post type.

How do I add an image to a custom field in WordPress?

Now you can use your custom field form in the post editor to define the link to your alternative image. Enter the name of your custom field (in this example it is “Alternative Image”) in the “Name” field and then the URL to your image in the “Value” field. Then click on “Add Custom Field”.

What is Elementor ACF?

Advanced Custom Fields (ACF) brings limitless possibilities for adding extra data to WordPress content by creating custom fields. Elementor allows you to dynamically insert the ACF custom field data directly into your Elementor designs with all the styling options you've come to expect from Elementor.


1 Answers

I had the same problem, you almost had it right, which helped me as well.

looked at ACF and the update_field accepts attachment ID as oppose to the the, pid or url

You can replace the return array:

return array(
    'pid' =>$pid,
    'url' =>$file['url']
);

With the following array:

return array(
  'pid' =>$pid,
  'url' =>$file['url'],
  'file'=>$file,
  'attach_id'=>$attach_id
);

and then change

update_field('field_512e085a9372a',$att['url'],$watch);

with the following

update_field('field_512e085a9372a',$att['attach_id'],$watch);
like image 196
Val Avatar answered Sep 28 '22 22:09

Val