2016-09-19 27 views
5

Wordpress sitemde küçük resimler olarak kullanmak üzere uzak sunucudan resimler kopyalamaya çalışıyorum. Bu görüntülerin bazıları kopyalandıktan sonra bozuluyor. Ne demek istediğimi gösteren İşte Kopyalama bittikten sonra görüntü bozulmuş

$url = 'http://media.cultserv.ru/i/1000x1000/'.$event->subevents[0]->image; 
$timeout_seconds = 100; 
$temp_file = download_url($url, $timeout_seconds); 

if(!is_wp_error($temp_file)) { 
    $file = array(
    'name' => basename($url), 
    'type' => wp_check_filetype(basename($url), null), 
    'tmp_name' => $temp_file, 
    'error' => 0, 
    'size' => filesize($temp_file), 
); 
    $overrides = array(
    'test_form' => false, 
    'test_size' => true, 
    'test_upload' => true, 
); 
    $results = wp_handle_sideload($file, $overrides); 
    if(empty($results['error'])) { 
    $filename = $results['file']; 
    $local_url = $results['url']; 
    $type = $results['type']; 
    $attachment = array(
     'post_mime_type' => $results['type'], 
     'post_title' => preg_replace('/.[^.]+$/', '', basename($results['file'])), 
     'post_content' => '', 
     'post_status' => 'inherit', 
     'post_type' => 'attachment', 
     'post_parent' => $pID, 
    ); 
    $attachment_id = wp_insert_attachment($attachment, $filename); 
    if($attachment_id) { 
     set_post_thumbnail($pID, $attachment_id); 
    } 
    } 
} 

bir ekran görüntüsü var (Sol - Orijinal görüntü; Sağ - benim sunucuda kopyalama): Burada

kodum var

screenshot

+0

'$ attachData = wp_generate_attachment_metadata ($ attachment_id, $ dosya) kullanmayı deneyin; wp_update_attachment_metadata ($ attach_id, $ attachData)' 've; "set_post_thumbnail" öğesini çağırıp sonuçta oluşan görüntünün iyileşip iyileşmediğini görün. Required_once (ABSPATH. 'Wp-admin/includes/image.php'); 'komut dosyasının bir kısmında da bulunduğundan emin olun. – fyrye

+0

Sorun, $ local_url dosyasında depolanan url tarafından erişilebilen resmin zaten bozuk olmasıdır. Ek oluşturulmadan önce. –

cevap

1

ben düşünüyorum senin download_url($url, $timeout_seconds) işlevi düzgün çalışmıyor (ağ/diğer hataları yakalamıyorsunuz, bu yüzden görüntüleri bozuyorsunuz), ayrıca zaman aşımı parametresinin gerçekten bir URL'yi indirmek için gerekli olduğunu sanmıyorum ...

böyle bir şey bu işlevi yeniden yazmak daha iyidir Bunu düzeltmek için:

function download_url($url) 
{ 
    $saveto = 'temp.jpg'; // generate temp file 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
    $raw = curl_exec($ch); 
    if (curl_errno($ch)) { 
     curl_close($ch); 
     return false; 
     // you probably have a network problem here. 
     // you need to handle it, for example retry or skip and reqeue the image url 
    } 
    curl_close($ch); 
    if (file_exists($saveto)) { 
     unlink($saveto); 
    } 
    $fp = fopen($saveto, 'x'); 
    fwrite($fp, $raw); 
    fclose($fp); 
    return $saveto; 
} 
İlgili konular