WordPress开发的过程中,有时候我们需要保存远程服务器上的文件或图片到WordPress的媒体库中,实现缓存或备份的功能,实现过程其实就是把远程服务器上的图片下载下来,然后插入到媒体库中。
使用WordPress的download_url功能下载文件
WordPress为我们提供了一个下载文件的函数download_url( $url )
,我们可以使用这个函数下载远程服务器的文件。
$tmp = download_url( $url );
使用WordPress的media_handle_sideload函数保存下载的文件到媒体库中
download_url( $url )
下载之后,只是把文件已临时文件的方式保存下来了,这一步,我们需要把临时文件保存到媒体库中。保存之前,我们需要先获取文件的文件名,如果对文件名没有要求,随机生成一个文件名也是可以的。然后使用WordPress的media_handle_sideload
功能保存文件到媒体库中。
/**
* 下载远程文件到WordPress服务器
* 目标远程文件需要是WordPress允许的文件格式
*
* @param $url
*
* @return false|int|\WP_Error
*/
function download_remote_file($url){
$tmp = download_url( $url );
$file_array = array();
// 为保存文件设置变量
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;
}
传递给上面的函数一个远程URL,他会下载这个URL到WordPress媒体库,插入到媒体数据库,然后返回给我们一个媒体库ID,我们可以根据这个ID做进一步的处理。
更简便的方法media_sideload_image
以上功能不仅可以保存远程服务器上的图片,还可以保存其他类型的文件,如果我们只是保存文件,还有一个更简便的方法: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');