2014-01-08 7 views
4

Я пишу плагин Wordpress для загрузки удаленных изображений в своем блоге.wp_generate_attachment_metadata возвращает пустой массив

Я сделал функцию, чтобы загрузить удаленное изображение локально, а затем вернуть его идентификатор. Все кажется хорошо за исключением того, что

$attach_data = wp_generate_attachment_metadata($attach_id, $local_file); 

возвращает мне пустой массив - и он не должен.

wp_generate_attachment_metadata, помимо прочего, ответственен за создание миниатюр загруженного изображения. Но у меня нет эскизов, созданных при запуске моего кода.

Я проверил значения, которые посылаю функции, и они кажутся правильными: у меня есть идентификатор и абсолютный путь к загруженному файлу, как указано в кодексе. Тем не менее, я не могу управлять, чтобы мой код работы:

$ attach_data не должно быть пустым ...

Может кто-нибудь помочь?

function upload_from_remote_url($url,$post_id){ 

    $url = $this->validate_remote_media_url($url); //check file is not on local server 
    if (!$url) return false; 

    if ($existing_id = $this->media_already_exists($url)) return $existing_id; //url already has been downloaded 

    $upload_dir = wp_upload_dir(); 
    $wp_mime_types = wp_get_mime_types(); 

    //fetch image 
    $response = wp_remote_get($url); 

    //get filename without extension 
    $filename = basename($url); //get filename & extension 
    $filename_strip = preg_replace('/\.[^.]*$/', '', $filename); //strip extension 

    //get extension from content type, 
    //because wp_upload_bits needs an extension and certain url don't have one. 

    $file_type = wp_remote_retrieve_header($response, 'content-type'); 
    $extensions = array_search($file_type,$wp_mime_types); 
    $extensions_arr = explode('|',$extensions); 
    $extension = $extensions_arr[0]; 

    $new_filename = $filename_strip.'.'.$extension; //full name 
    $new_filename = wp_unique_filename($upload_dir['path'], $new_filename); // be sure this name do not exist already 

    $uploaded = wp_upload_bits($new_filename, '', wp_remote_retrieve_body($response)); 
    if ($uploaded['error']) return false; 

    $local_file = $uploaded['file']; 
    $local_filename = basename($local_file); 
    $local_filetype = wp_check_filetype($local_filename, null); 

    //Attachment options 
    $attachment = array(
     'post_title'=> $local_filename, 
     'post_mime_type' => $local_filetype, 
     'post_status' => 'inherit' 
    ); 

    // Add the image to your media library 
    $attach_id = wp_insert_attachment($attachment, $local_file, $post_id); 

    if (!$attach_id) return false; 

    $attach_data = wp_generate_attachment_metadata($attach_id, $local_file); 

    wp_update_attachment_metadata($attach_id, $attach_data); 

    //save source link so we do not import several times the same media 
    update_post_meta($attach_id, 'grm_source', $url); 

    return $attach_id; 

} 

BTW, если WP gourou что-нибудь сказать об этом коде ... Я буду рад прочитать, как WP документация о загрузке файлов немного неаккуратно. Мне нужно было кое-что конкретное здесь, поскольку я мог получить расширение файла. Я закончил с этим, но, может быть, у вас есть несколько лучших идей!

ответ

1

Это то, что, наконец, установил ее для меня:

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

Объяснение: Я не совсем уверен, почему это исправлена ​​ошибка для меня, но я предполагаю, что это либо что-то делать с помощью плагинов, используя крюк wp_handle_upload или что фильтры добавляют в него метаданные, которые в противном случае отсутствовали бы в функции wp_generate_attachment_metadata.

Полная функция:

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

делает это также создайте эскизы для pdf, для меня мой код создает эскиз для изображений, но не для файлов pdf или rar или zip? –

0

У меня была аналогичная проблема, где недостающий тип мим. Так как я использую только один тип пантомимы, она была зафиксирована

'post_mime_type' => 'image/jpeg' 

После этого, он еще не обновляет метаданные, но принуждая обновление с «wp_update_attachment_metadata» решить эту проблему:

$attach_data = wp_generate_attachment_metadata($attach_id, $file_path); 
wp_update_attachment_metadata($attach_id, $attach_data); 
Смежные вопросы