据报,新浪博客已正式宣布“相册”功能下线,最后期限是2019年7月31日24时,又一个免费的午餐没了。
如何把放在新浪相册的图片下载到本地并替换原来的链接,摆在了众多使用新浪免费图床用户面前,当然也包括我。经多方查找测试,将本人最终解决办法,分享给大家。
WordPress很多插件或者代码都可以实现在编辑文章中自动将外链图片下载到本地,最终我选择了一个叫:Easy Copy Paste的插件。
提取码: khc5
也可以直接将下面的代码,添加到当前主题函数模板 functions.php 中:
function ecp_save_post($post_id, $post) { global $wpdb; if($post->post_status == 'publish') { $p = '/<img.*[\s]src=[\"|\'](.*)[\"|\'].*>/iU'; $num = preg_match_all($p, $post->post_content, $matches); if ($num) { $wp_upload_dir = wp_upload_dir(); set_time_limit(0); $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS,20); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $ecp_options = $_SERVER['HTTP_HOST']; foreach ($matches[1] as $src) { if (isset($src) && strpos($src, $ecp_options) === false) { $file_info = wp_check_filetype(basename($src), null); if ($file_info['ext'] == false) { date_default_timezone_set('PRC'); $file_name = date('YmdHis-').dechex(mt_rand(100000, 999999)).'.tmp'; } else { $file_name = dechex(mt_rand(100000, 999999)) . '-' . basename($src); } curl_setopt($ch, CURLOPT_URL, $src); $file_path = $wp_upload_dir['path'] . '/' . $file_name; $img = fopen($file_path, 'wb'); curl_setopt($ch, CURLOPT_FILE, $img); $img_data = curl_exec($ch); fclose($img); if (file_exists($file_path) && filesize($file_path) > 0) { $t = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); $arr = explode('/', $t); if (pathinfo($file_path, PATHINFO_EXTENSION) == 'tmp') { $file_path = ecp_handle_ext($file_path, $arr[1], $wp_upload_dir['path'], $file_name, 'tmp'); } elseif (pathinfo($file_path, PATHINFO_EXTENSION) == 'webp') { $file_path = ecp_handle_ext($file_path, $arr[1], $wp_upload_dir['path'], $file_name, 'webp'); } $post->post_content = str_replace($src, $wp_upload_dir['url'] . '/' . basename($file_path), $post->post_content); $attachment = ecp_get_attachment_post(basename($file_path), $wp_upload_dir['url'] . '/' . basename($file_path)); $attach_id = wp_insert_attachment($attachment, ltrim($wp_upload_dir['subdir'] . '/' . basename($file_path), '/'), 0); $attach_data = wp_generate_attachment_metadata($attach_id, $file_path); $ss = wp_update_attachment_metadata($attach_id, $attach_data); } } } curl_close($ch); $wpdb->update( $wpdb->posts, array('post_content' => $post->post_content), array('ID' => $post->ID)); } } } function ecp_handle_ext($file, $type, $file_dir, $file_name, $ext) { switch ($ext) { case 'tmp': if (rename($file, str_replace('tmp', $type, $file))) { if ('webp' == $type) { return ecp_image_convert('webp', 'jpeg', $file_dir . '/' . str_replace('tmp', $type, $file_name)); } return $file_dir . '/' . str_replace('tmp', $type, $file_name); } case 'webp': if ('webp' == $type) { return ecp_image_convert('webp', 'jpeg', $file); } else { if (rename($file, str_replace('webp', $type, $file))) { return $file_dir . '/' . str_replace('webp', $type, $file_name); } } default: return $file; } } function ecp_image_convert($from='webp', $to='jpeg', $image) { $im = imagecreatefromwebp($image); if (imagejpeg($im, str_replace('webp', 'jpeg', $image), 100)) { try { unlink($image); } catch (Exception $e) { $error_msg = sprintf('Error removing local file %s: %s', $image, $e->getMessage()); error_log($error_msg); } } imagedestroy($im); return str_replace('webp', 'jpeg', $image); } function ecp_get_attachment_post($filename, $url) { $file_info = wp_check_filetype($filename, null); return array( 'guid' => $url, 'post_type' => 'attachement', 'post_mime_type' => $file_info['type'], 'post_title' => preg_replace('/\.[^.]+$/', '', $filename), 'post_content' => '', 'post_status' => 'inherit' ); } add_action('save_post', 'ecp_save_post', 120, 2);
代码取自上述插件。
单篇操作
之后,编辑文章只需要点击更新按钮,就可以将文章中的外链图片下载到本地并替换链接。
不过逐个编辑文章不仅繁琐而且工作量不小,这里教大家一个小技巧,可以批量下载文章中的外链图片。
批量操作
该插件的代码不仅可以在正常的编辑页面点击更新按钮触发下载功能,而且可以在后台所有文章列表页面中触发下载图片功能,原理明白了,操作就简单了。
进入WP后台,文章→所有文章,进入文章管理页面,勾选“标题”全选当前页面的所有文章,并选择“编辑”,并点击“应用”按钮。
切记,不要更改批量编辑中的任何设置,只需单击 “更新”即可。
这个过程将触发检查所有选定的文章,并导入外链图片。
默认每页只显示20篇文章,如果你的文章较多,并想一次性处理更多的文章,可以打开右上角的“显示选项”,将“每页的项目数”调整为9999,当然要视你的主机配置适当调整文章数量,一次性处理太多文章,会让主机瞬间资源耗尽,造成宕机。
注:begin主题用户,操作前需要进入主题选项→辅助功能中,勾选“只有临时使用文章快速编辑和定时发布时使用,防止文章选项勾选丢失”,否则批量更新后,之前勾选的文章设置和手动添加的缩略图等将失效,切记!
提示:操作前请提前做好数据库备份,以防万一,祝大家图片逃亡成功!
还有另一款自动下载外链图片的插件推荐给大家:Auto Upload Images
不过该插件替换原图片时,图片命名和链接有问题,大家也可以测试一下。

2019年5月9日 11点17分 1F
哎,凉凉啊,这可怎么办哦
2019年5月9日 23点07分 B1
@ 仙踪小栈 有个问题,怎么快速找到外链图片啊,有的也忘记了。
2019年5月10日 12点30分 B2
@ 励志语录网 begin主题就那么几个外链图片ડડ
2019年5月10日 18点25分 B3
@ 诗梦 额,我说是文章里面的啊
2019年5月9日 12点07分 2F
我来占个位置
2019年5月9日 15点57分 3F
没想到后台的那个批量更新竟然还有这个功能,牛!!!
2019年5月9日 16点59分 4F
国内图床不牢靠吧。
2019年5月9日 19点58分 5F
心塞,好多图片。。。。
2019年5月9日 21点03分 6F
微博相册可以继续用吧
2019年5月10日 08点44分 7F
感谢大神的分享,满满的干货
2019年5月10日 10点06分 8F
我就是来,测一下,这个滑动解锁的功能有没有bug
2019年5月10日 12点27分 B1
@ 佚名 哈哈哈
2019年5月10日 19点18分 9F
这个很及时
2019年5月10日 19点30分 10F
经测试,全部外链都本地化,怎么能只让微博图片替换呢
2019年5月15日 09点49分 11F
鸟哥,begin主题的图片本地化应该加强一下,感觉每次都没有本地化
2019年5月17日 10点33分 12F
晕了,我又要忙活了,300多张图片额。
2019年5月17日 14点25分 B1
@ 丁春华博客 微相册中的图片应该没有影响
2019年5月17日 14点35分 13F
现在互联网的免费没有得到其他渠道的变相盈利是不会长久的!
2019年5月17日 19点05分 14F
感谢分享
2019年5月19日 17点08分 15F
我用的qqwolrd的插件下载外链图片。
2019年5月19日 20点53分 16F
学习了
2019年5月20日 23点48分 17F
文章不错非常喜欢,支持
2019年5月21日 08点11分 18F
占个位置,我是不是来晚了
2019年5月21日 13点48分 19F
正在苦恼,为啥“关于本站”的背景图无法显示,请问如何更换?
2019年5月25日 15点15分 20F
早就知道国内这个环境,没有免费的长久资源。还好,我的站点上。没有使用这个图床。。。
2019年5月27日 00点07分 21F
空间不够才用外链,导入算什么情况
2019年6月1日 17点34分 22F
Auto Upload Images 原来用过,特别适用搬运工,但插件许久没更新了,新版本的 WordPress 下有问题。
2019年6月2日 22点23分 23F
外链都不靠谱,说不定哪天就没了
2019年6月28日 22点46分 24F
支持新编辑器吗
2019年7月3日 12点15分 25F
qq word 插件可以一键保存所有的
2019年7月13日 20点55分 26F
这插件很强大啊,对于前期使用图床,后期想正规做的网站来说简直就是福音啊,如果一篇一篇的去修改,不知道会改到牛年马月去啦,有这主题,简单几步操作就可以啦。不过对于还停留在虚拟主机或者是低配主机的站长来说,这插件在使用时是不是要深夜处理会比较好呢?会不会主机处理不过来?