wp_generate_attachment_metadata gives me an empty array

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.

Read More

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>';
print_r($filename);
echo '</pre>';
echo '<pre>';
print_r($attach_data);
echo '</pre>';

and here is the output:

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

As you can see, $attach_data is empty 🙁

Related posts

Leave a Reply

2 comments

  1. 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 ); 
    
  2. This is, what finally fixed it for me:

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

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