foreach ($_FILES as $key => $file) {
            $uploadedImage = wp_handle_upload($_FILES[$key], $upload_overrides);


            if (!isset($uploadedImage['error'])) {

                $attachID = wp_insert_attachment($uploadedImage, $uploadedImage['file']);

                require_once(ABSPATH . 'wp-admin/includes/image.php');
                $attach_data = wp_generate_attachment_metadata( $attachID, $uploadedImage['file'] );


                wp_update_attachment_metadata( $attachID, $attach_data );

            } else {


Im almost positive this code should work. I have looked around and people were saying once the added the require_once this worked.

The upload works, the file is added to the media library but no metadata is generated.

Any suggestions?


1 Answer 1


I believe the following is happening here:

  1. As @Luke pointed out, wp_insert_attachment() takes an array of post data. The format of the array you are passing to it is not correct. The keys are different. What should be stored as the post_mime_type, is being passed with the key type. Because of this, no mime type is being saved for the post.
  2. wp_generate_attachment_metadata() is looking for the mime type so it can generate the metadata based on that. But since the mime type wasn't saved correctly it just returns an empty array.

The solution is to do $uploadedImage['post_mime_type'] = $uploadedImage['type'], or better yet use media_handle_upload(), which will handle the whole media upload for you.

Example based on your code:

foreach ( $_FILES as $key => $file ) {
    media_handle_upload( $key, 0, array(), $upload_overrides );

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.