wordpress 远程图片抓取
在很多时候,看到好的文章想转载过来到自己的博客上。但是由于复制的时候,图片等资源还是源站点的链接,一旦源站不能访问或者删除了,就不能正常的访问了。
所以就有了很多将远程文件抓取到自己的博客上,并替换相关链接。
但事实上,现在wordpress现存的插件都是使用内置的图片上传。这个对于伪静态是postname的人来说没啥大问题。
不过对于用id作为伪静态或者是追求对id的连续性的人来说,这就是一个让人崩溃的事情了。就必须得人工下载图片,并用ftp等工具上传,再把图片资源的连接修改。麻烦不说,还容易出现修改错误。
所以我就在现有插件的情况下,移除使用wordpress 内置的上传功能,改用curl的方式来对图片资源的抓取,并修改图片的链接到本地url上。
wordpress 还是尽量少用插件,所以我就在functions.php文件中实现了。
首先是curl抓取图片内容部分,这里使用了多线程来达到快速抓取
需要注意的是,你可以使用CURLOPT_FOLLOWLOCATION
这个选项来对有转跳的图片进行抓取,因为我使用了open_basedir
功能,所以就不能用这个选项了。
add_action('publish_post', 'fetch_images');
function fetch_images( $post_ID ) {
//Check to make sure function is not executed more than once on save
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
return;
}
if ( !current_user_can('edit_post', $post_ID) ) {
return;
}
remove_action('publish_post', 'fetch_images');
$post = get_post($post_ID);
$first_image = array();
if(preg_match_all('//i', $post->post_content, $matches)){
if(is_array($matches [1])) {
$first_image = $matches [1];
}
}
$imgarr = array();
foreach ($first_image as $url){
if (strpos($url, $_SERVER['HTTP_HOST'])===false) {
$imgarr[] = $url;
}
}
//根据$data数组中保存的图片文本流数据生成相应图片
$data = Curl_down_image($imgarr, $timeout='30');
foreach ((array)$data as $k => $v){
if($v !=''){ //图片数据存在
file_put_contents(ABSPATH.'/wp-content/uploads/remoteimage/'.$k, $v);
}
}
unset($data);
foreach ($imgarr as $k => $url) {
$name = array_pop(explode('/', $url));
$post->post_content = str_replace($url, get_bloginfo('url').'/wp-content/uploads/remoteimage/'.$name, $post->post_content);
}
wp_update_post(array('ID' => $post_ID, 'post_content' => $post->post_content));
add_action('publish_post', 'fetch_images');
}
在这个函数中,你需要修改的是存放远程图片的路径。如果不想改,也可以保持这个样子。 接下来就是要手工的新建对应的目录了,还要注意目录的权限问题,要不然图片就不能保存了。
上面的修改完成后,就可以在编辑一下文章或者新建一篇文章,里面需要包含了外链的图片。 保存后看编辑框是否显示出原来的图片,或者查看源代码看链接是否修改过来了。也可以到网站对应存放路径看是否有图片存在。
OK,全部修改完成,妈妈再也不用担心我的id不连续了。
【声明】本文 wordpress 远程图片抓取 为柠之漠然原创文章,转载请注明出自
枫之落叶
并保留本文有效链接:https://blog.shiniv.com/2014/03/get-remote-image-for-wordpress/ , 转载请保留本声明!