I have a custom post type and a metabox with a file input.

I can insert the attachment, but I can't update the attachment metadata and I don't know how to fix it because I don't receive any error.

Here is my code:

$attach_id = wp_insert_attachment( $attachment, $filename, $post_id );
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id,  $attach_data ); 

echo $attach_id;
echo '<pre>';
echo '</pre>';
echo '<pre>';
echo '</pre>';

and here is the output:

    [name] => one.png
    [type] => image/png
    [tmp_name] => /tmp/phphQ0e2v
    [error] => 0
    [size] => 144555

As you can see, $attach_data is empty :(

  • 1
    Solved. I had to add $upload = wp_handle_upload($filename, array('test_form' => false)); and then pass "$upload['file']" to wp_insert_attachment and wp_update_attachment_metadata instead of $filename :)
    – Klian
    Apr 24, 2012 at 17:20
  • 1
    Please add your solution as an answer and mark the question as answered. Thanks.
    – fuxia
    Apr 25, 2012 at 15:31
  • It is important to note that the first argument of wp_handle_upload is not a string but an array. So just passing the file-path won't work.. Apr 10, 2014 at 19:41

2 Answers 2


From comment:

Let WordPress generate a file path and use that for the next steps:

$upload    = wp_handle_upload($filename, array('test_form' => false));
$attach_id = wp_insert_attachment( $attachment, $upload['file'], $post_id );
wp_update_attachment_metadata( $attach_id,  $attach_data ); 

This is, what finally fixed it for me:

apply_filters('wp_handle_upload', array(
    'file' => $file_path, 
    'url' => $file_url, 
    'type' => $file_type), 

Explanation: I'm not quite sure why this fixed the error for me, but I assume that this either has something to do with plugins using the wp_handle_upload hook or that the filters add meta-data to the attachment, which otherwise would be missing in the wp_generate_attachment_metadata function.

Full function:

function add_to_media_lib($file_url, $file_path, $parent_post_id)
require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');

// Check the type of tile. We'll use this as the 'post_mime_type'.
$file_type = wp_check_filetype(basename($file_url), null);

// Get the path to the upload directory.
$wp_upload_dir = wp_upload_dir();

// Prepare an array of post data for the attachment.
$attachment = array(
    'guid' => $wp_upload_dir['url'] . '/' . basename($file_url),
    'post_mime_type' => $file_type['type'],
    'post_title' => preg_replace('/\.[^.]+$/', '', basename($file_url)),
    'post_content' => '',
    'post_status' => 'inherit',
    'post_parent' => $parent_post_id

// Insert the attachment.
$attach_id = wp_insert_attachment($attachment, $file_url, $parent_post_id);

// apply filters (important in some environments)
apply_filters('wp_handle_upload', array('file' => $file_path, 'url' => $file_url, 'type' => $file_type), 'upload');

// Generate the metadata for the attachment, and update the database record.
if ($attach_data = wp_generate_attachment_metadata($attach_id, $file_path)) {
    wp_update_attachment_metadata($attach_id, $attach_data);
} else {
    echo '<div id="message" class="error"><h1>Failed to create PDF-thumbnail Meta-Data</h1><pre>' . print_r($attach_data) . '</pre></div>';

return $attach_id;
  • Always add a short description to why your solution works, don't just add a lot of code and says it works. Apr 10, 2014 at 21:17

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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