据报,新浪博客已正式宣布“相册”功能下线,最后期限是2019年7月31日24时,又一个免费的午餐没了。
如何把放在新浪相册的图片下载到本地并替换原来的链接,摆在了众多使用新浪免费图床用户面前,当然也包括我。经多方查找测试,将本人最终解决办法,分享给大家。
WordPress很多插件或者代码都可以实现在编辑文章中自动将外链图片下载到本地,最终我选择了一个叫:Easy Copy Paste的插件。
也可以直接将下面的代码,添加到当前主题函数模板 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
不过该插件替换原图片时,图片命名和链接有问题,大家也可以测试一下。
本站文章大部分为原创,用于个人学习记录,可能对您有所帮助,仅供参考!
陕西省西安市 1F
哎,凉凉啊,这可怎么办哦
浙江省杭州市 B1
@ 仙踪小栈 有个问题,怎么快速找到外链图片啊,有的也忘记了。
浙江省杭州市 B2
@ 励志语录网 begin主题就那么几个外链图片ડડ
陕西省西安市 B3
@ 诗梦 额,我说是文章里面的啊
河南省郑州市 2F
我来占个位置
陕西省西安市 3F
没想到后台的那个批量更新竟然还有这个功能,牛!!!
河南省郑州市 4F
国内图床不牢靠吧。
河南省郑州市 5F
心塞,好多图片。。。。
浙江省杭州市 6F
微博相册可以继续用吧
浙江省杭州市 7F
感谢大神的分享,满满的干货
陕西省西安市 8F
我就是来,测一下,这个滑动解锁的功能有没有bug
浙江省杭州市 B1
@ 佚名 哈哈哈
陕西省西安市 9F
这个很及时
浙江省杭州市 10F
经测试,全部外链都本地化,怎么能只让微博图片替换呢
陕西省西安市 11F
鸟哥,begin主题的图片本地化应该加强一下,感觉每次都没有本地化
河南省郑州市 12F
晕了,我又要忙活了,300多张图片额。
中国 B1
@ 丁春华博客 微相册中的图片应该没有影响
陕西省西安市 13F
现在互联网的免费没有得到其他渠道的变相盈利是不会长久的!
河南省郑州市 14F
感谢分享
陕西省西安市 15F
我用的qqwolrd的插件下载外链图片。
陕西省西安市 16F
学习了
河南省郑州市 17F
文章不错非常喜欢,支持
河南省郑州市 18F
占个位置,我是不是来晚了
河南省郑州市 19F
正在苦恼,为啥“关于本站”的背景图无法显示,请问如何更换?
陕西省西安市 20F
早就知道国内这个环境,没有免费的长久资源。还好,我的站点上。没有使用这个图床。。。
浙江省杭州市 21F
空间不够才用外链,导入算什么情况
陕西省西安市 22F
Auto Upload Images 原来用过,特别适用搬运工,但插件许久没更新了,新版本的 WordPress 下有问题。
陕西省西安市 23F
外链都不靠谱,说不定哪天就没了
河南省郑州市 24F
支持新编辑器吗
陕西省西安市 25F
qq word 插件可以一键保存所有的
河南省郑州市 26F
这插件很强大啊,对于前期使用图床,后期想正规做的网站来说简直就是福音啊,如果一篇一篇的去修改,不知道会改到牛年马月去啦,有这主题,简单几步操作就可以啦。不过对于还停留在虚拟主机或者是低配主机的站长来说,这插件在使用时是不是要深夜处理会比较好呢?会不会主机处理不过来?
莫桑比克 27F
超实用的教程,感谢分享