WordPress 文章中远程图片自动保存到本地服务器,最大的好处就是复制粘贴,方便对文章的转载复制。就现实中而言,并不是所有网站都会全部写原创内容或者想伪原创一下,有些好文章想转载,但是对方网站有可能对图片进了防盗链,而图文比较多的情况下,那么就相当麻烦,而此代码功能可有效的帮助你转载复制。
不过,无论载转与否,建议保留出处,这是对原作者的尊重,毕竟人家写得辛苦,编辑也不容易。假使是你自己的原创作品,被人盗去并盗用了作者出处,你一定也会很恼火的。所以,将心比心。
好了,话不多说,进入正题。虽说有不少插件能实现这个功能,比如《WordPress 直接粘贴图片到文章编辑器插件 Imagepaste》,但是,有可能插件太多了,会影响网站的性能或者拖累服务器,降低网站的运行速度。但凡能代码实现的,我们都比较推荐使用代码,集成到 wordpress 主题功能中。
实现方法:
复制下面的代码,然后粘贴到你当前 WordPress 主题的模版函数(functions.php)文件中保存即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
//自动本地化外链图片 add_filter( 'content_save_pre' , 'auto_save_image' ); function auto_save_image( $content ) { $upload_path = '' ; $upload_url_path = get_bloginfo( 'url' ); //上传目录 if (( $var = get_option( 'upload_path' )) != '' ){ $upload_path = $var ; } else { $upload_path = 'wp-content/uploads' ; } if (get_option( 'uploads_use_yearmonth_folders' )) { $upload_path .= '/' . date ( "Y" ,time()). '/' . date ( "m" ,time()); } //文件地址 if (( $var = get_option( 'upload_url_path' )) != '' ) { $upload_url_path = $var ; } else { $upload_url_path = bloginfo( 'url' ); } if (get_option( 'uploads_use_yearmonth_folders' )) { $upload_url_path .= '/' . date ( "Y" ,time()). '/' . date ( "m" ,time()); } require_once ( "../wp-includes/class-snoopy.php" ); $snoopy_Auto_Save_Image = new Snoopy; $img = array (); //以文章的标题作为图片的标题 if ( ! empty ( $_REQUEST [ 'post_title' ] ) ) $post_title = wp_specialchars( stripslashes ( $_REQUEST [ 'post_title' ] )); $text = stripslashes ( $content ); if (get_magic_quotes_gpc()) $text = stripslashes ( $text ); preg_match_all( "/ src=("|'){0,}(http://(.+?))("|'|s)/is" , $text , $img ); $img = array_unique (dhtmlspecialchars( $img [2])); foreach ( $img as $key => $value ){ set_time_limit(180); //每个图片最长允许下载时间,秒 if ( str_replace (get_bloginfo( 'url' ), "" , $value )== $value && str_replace (get_bloginfo( 'home' ), "" , $value )== $value ){ //判断是否是本地图片,如果不是,则保存到服务器 $fileext = substr ( strrchr ( $value , '.' ),1); $fileext = strtolower ( $fileext ); if ( $fileext == "" || strlen ( $fileext )>4) $fileext = "jpg" ; $savefiletype = array ( 'jpg' , 'gif' , 'png' , 'bmp' ); if (in_array( $fileext , $savefiletype )){ if ( $snoopy_Auto_Save_Image ->fetch( $value )){ $get_file = $snoopy_Auto_Save_Image ->results; } else { echo "error fetching file: " . $snoopy_Auto_Save_Image ->error. "<br>" ; echo "error url: " . $value ; die (); } $filetime = time(); $filepath = "/" . $upload_path ; //图片保存的路径目录 ! is_dir ( ".." . $filepath ) ? mkdirs( ".." . $filepath ) : null; //$filename = date("His",$filetime).random(3); $filename = substr ( $value , strrpos ( $value , '/' ), strrpos ( $value , '.' )- strrpos ( $value , '/' )); //$e = '../'.$filepath.$filename.'.'.$fileext; //if(!is_file($e)) { // copy(htmlspecialchars_decode($value),$e); //} $fp = @ fopen ( ".." . $filepath . $filename . "." . $fileext , "w" ); @fwrite( $fp , $get_file ); fclose( $fp ); $wp_filetype = wp_check_filetype( $filename . "." . $fileext , false ); $type = $wp_filetype [ 'type' ]; $post_id = (int) $_POST [ 'temp_ID2' ]; $title = $post_title ; $url = $upload_url_path . $filename . "." . $fileext ; $file = $_SERVER [ 'DOCUMENT_ROOT' ]. $filepath . $filename . "." . $fileext ; //添加数据库记录 $attachment = array ( 'post_type' => 'attachment' , 'post_mime_type' => $type , 'guid' => $url , 'post_parent' => $post_id , 'post_title' => $title , 'post_content' => '' , ); $id = wp_insert_attachment( $attachment , $file , $post_parent ); $text = str_replace ( $value , $url , $text ); //替换文章里面的图片地址 } } } $content = AddSlashes ( $text ); remove_filter( 'content_save_pre' , 'auto_save_image' ); return $content ; } function mkdirs( $dir ){ if (! is_dir ( $dir )){ mkdirs(dirname( $dir )); mkdir ( $dir ); } return ; } function dhtmlspecialchars( $string ) { if ( is_array ( $string )) { foreach ( $string as $key => $val ) { $string [ $key ] = dhtmlspecialchars( $val ); } } else { $string = str_replace ( '&' , '&' , $string ); $string = str_replace ( '"' , '"' , $string ); $string = str_replace ( '<' , '<' , $string ); $string = str_replace ( '>' , '>' , $string ); $string = preg_replace( '/&(#d;)/' , '&1' , $string ); } return $string ; } |
以后你发表文章时就不用去管文章中的外链图片了,因为上面的代码会自动将文章中包含的外链图片自动保存到本地,是不是很方便的 wordpress 技巧呀。