這幾天用Wordpress搭建了一個圖片站,在填充內容時遇到一個問題當我在媒體庫中上傳圖片時有些圖片可以正常顯示,但是個別圖片就是顯示不出來縮圖,這個問題著實讓我糾結了一下午。沒辦法尋找原因少不了研究代碼,默默的戴上眼鏡勤奮工作吧!
圖片不顯示的原因
俗話說:“功夫不負苦心人呢”,問題還是被我給發現了,原來編碼的問題如果我們上傳的圖片名稱是中文的那麼wp的縮圖機制處理不了於是就出現了我這樣的問題。
在wp-admin/includes/file.php檔案中有這麼一段代碼其中第2行控制著我們上傳圖片的命名:
// Move the file to the uploads dir
$new_file = $uploads[‘path’] . “/$filename”; //新上傳的圖片按上傳時的名稱顯示
if ( false === @ move_uploaded_file( $file[‘tmp_name’], $new_file ) ) {
if ( 0 === strpos( $uploads[‘basedir’], ABSPATH ) )
$error_path = str_replace( ABSPATH, ”, $uploads[‘basedir’] ) . $uploads[‘subdir’];
else
$error_path = basename( $uploads[‘basedir’] ) . $uploads[‘subdir’];
return $upload_error_handler( $file, sprintf( __(‘The uploaded file could not be moved to %s.’ ), $error_path ) );
}
既然定位到了問題所在當然就是趕緊解決掉好讓圖片正常顯示了!
處理方法匯總
問題既然浮出了水面,按照一個度娘的忠實粉絲當然是先上百度去找答案,下面是百度尋找到的3種答案。
第一種:修改wp的程式檔案file.php
在file.php中尋找下面這段代碼
$new_file = $uploads['path'] . "/$filename";
把上述代碼修改成
$new_file = $uploads['path'] . "/".date("YmdHis").floor(microtime()*1000).".".$ext;
顯示的結果是以“年月日時分秒+千位毫秒整數”這樣的格式命名的。
這 種方法弊端很大:第一上傳的圖片全部都會重新命名;第二wp更新到新版本還要重新修改代碼。
第二種:在主題functions.php中添加代碼
function wpyou_rename_upload_file_prefilter($file){
$time=date("Y-m-d");
$file['name'] = $time."".mt_rand(1,100).".".pathinfo($file['name'] , PATHINFO_EXTENSION);
return $file;
}
add_filter('wp_handle_upload_prefilter', 'wpyou_rename_upload_file_prefilter');
實現的效果和第一種的結果是一樣的,這樣每次更新wp都不用再反覆修改程式檔案了,但是弊端還是有就是上傳的圖片全部都會重新命名。
完美的解決方案
如果按照上面的方法修改的話我上傳的圖片都要被重新命名對於我這種用雲端硬碟來儲存圖片的使用者來說是個麻煩,於是只能自己動手了。下面給出一種完美的解決方案,當你上傳圖片時,主題會檢測圖片名中是否包含中文字元,如果包含就執行重新命名的機制,如果不包含那麼直接用上傳的名稱作為圖片名,直接添加下面這段代碼到主題的functions.php檔案中即可。
function tin_custom_upload_name($file){
if(preg_match('/[一-?]/u',$file['name'])):
$ext=ltrim(strrchr($file['name'],'.'),'.');
$file['name']=preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME'])).'_'.date('Y-m-d_H-i-s').'.'.$ext;
endif;
return $file;
}
add_filter('wp_handle_upload_prefilter','tin_custom_upload_name',5,1);
通過上面的程式碼片段中文圖片不能顯示縮圖的問題終於完美解決了。看來以後還是要研究一下wp程式的一些功能呀!今天把這種方法寫到這裡希望可以協助到遇到跟我一樣問題的朋友!