Save files or images from remote servers to WordPress Media Library

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');

Related Posts

Leave a Reply

Your email address will not be published. Required fields are marked *