WordPress開發(fā)的過程中,有時候我們需要保存遠(yuǎn)程服務(wù)器上的文件或圖片到WordPress的媒體庫中,實(shí)現(xiàn)緩存或備份的功能,實(shí)現(xiàn)過程其實(shí)就是把遠(yuǎn)程服務(wù)器上的圖片下載下來,然后插入到媒體庫中。
使用WordPress的download_url功能下載文件
WordPress為我們提供了一個下載文件的函數(shù)download_url( $url ),我們可以使用這個函數(shù)下載遠(yuǎn)程服務(wù)器的文件。
$tmp = download_url( $url );
使用WordPress的media_handle_sideload函數(shù)保存下載的文件到媒體庫中
download_url( $url )下載之后,只是把文件已臨時文件的方式保存下來了,這一步,我們需要把臨時文件保存到媒體庫中。保存之前,我們需要先獲取文件的文件名,如果對文件名沒有要求,隨機(jī)生成一個文件名也是可以的。然后使用WordPress的media_handle_sideload功能保存文件到媒體庫中。
/**
* 下載遠(yuǎn)程文件到WordPress服務(wù)器
* 目標(biāo)遠(yuǎn)程文件需要是WordPress允許的文件格式
*
* @param $url
*
* @return false|int|\WP_Error
*/
function download_remote_file($url){
$tmp = download_url( $url );
$file_array = array();
// 為保存文件設(shè)置變量
preg_match('/[^\?]+\.(jpg|jpe|jpeg|gif|png)/i', $url, $matches);
$file_array['name'] = basename($matches[0]);
$file_array['tmp_name'] = $tmp;
// 如果保存臨時文件失敗,刪除文件
if ( is_wp_error( $tmp ) ) {
@unlink($file_array['tmp_name']);
$file_array['tmp_name'] = '';
}
// 保存文件到媒體庫
$id = media_handle_sideload( $file_array, 0 );
// 如果保存失敗,刪除文件
if ( is_wp_error($id) ) {
@unlink($file_array['tmp_name']);
return $id;
}
return false;
}
傳遞給上面的函數(shù)一個遠(yuǎn)程URL,他會下載這個URL到WordPress媒體庫,插入到媒體數(shù)據(jù)庫,然后返回給我們一個媒體庫ID,我們可以根據(jù)這個ID做進(jìn)一步的處理。
更簡便的方法media_sideload_image
以上功能不僅可以保存遠(yuǎn)程服務(wù)器上的圖片,還可以保存其他類型的文件,如果我們只是保存文件,還有一個更簡便的方法:media_sideload_image,只需要以下幾行代碼就可以了。
$url = "http://wordpress.org/about/images/logos/wordpress-logo-stacked-rgb.png";
$post_id = 1;
$desc = "The WordPress Logo";
$image = media_sideload_image($url, $post_id, $desc);
如果在WordPress的前臺頁面中使用,需要引入以下個文件:
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');


