WordPress文章远程图片(外链)自动本地化

要实现WordPress文章中远程图片的自动本地化(即将外链图片下载并保存到本地服务器),您可以考虑使用插件或自定义代码来实现这个功能。以下是一种可能的方法:

方法一:使用插件

  1. 安装并激活“Auto Upload Images”插件或类似的插件。您可以在WordPress插件市场中搜索并安装该插件。

  2. 配置插件的设置。通常,这些设置允许您指定将外部图片下载到本地的文件夹位置以及其他参数。您可以根据您的需求进行设置。

  3. 编写或编辑您的文章时,插件会自动检测并下载文章中的远程图片,并将它们保存到本地服务器。请注意,这只会影响新添加的图片,不会自动处理已经存在的图片。

方法二:自定义代码

如果您更喜欢通过自定义代码来实现此功能,可以按照以下步骤操作:

  1. 首先,在您的WordPress主题的functions.php文件中添加以下代码,以启用远程图片下载并保存到本地的功能:

function custom_upload_remote_images($content) {preg_match_all('/<img[^>]src=['"]([^'"])['"][^>]>/i', $content, $matches);if (!empty($matches[1])) {foreach ($matches[1] as $image_url) {// 获取远程图片$image = file_get_contents($image_url);// 生成本地文件名$upload_dir = wp_upload_dir();$filename = basename($image_url);$local_image_path = $upload_dir['path'] . '/' . $filename;// 保存图片到本地file_put_contents($local_image_path, $image);// 替换文章中的远程图片链接为本地链接$content = str_replace($image_url, $upload_dir['url'] . '/' . $filename, $content);}}return $content;}add_filter('the_content', 'custom_upload_remote_images');
  1. 保存并激活您的主题。

  2. 然后,您可以在文章中添加远程图片链接,当您发布或更新文章时,上述代码将自动将它们下载并保存到本地服务器。

请注意,使用自定义代码需要谨慎,确保您的主题和WordPress安装是最新的,并且您在编辑文章时小心添加远程图片链接,以避免安全问题。使用插件可能是更简单和安全的选择。

不用插件实现wordpress远程图片自动本地化,在wordpress主题文件function.php文件中添加下方代码即可。


1、版本一。在新版的wordpress版本6之后就失效了


//自动本地化外链图片

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;

}


2、版本二、推荐使用,新版本word press测试可用


//将远程图片地址 本地化 这个在前台编辑器中使用时会有问题

function post_save_images($content) {

    set_time_limit(240);

    global $post;

    $post_id = $post->ID;

    $preg = preg_match_all('/<img.*?src="(.*?)"/', stripslashes($content) , $matches);

    if ($preg) {

        $i = 1;

        foreach ($matches[1] as $image_url) {

            if (empty($image_url)) continue;

            $pos = strpos($image_url, get_bloginfo('url'));

            if ($pos === false) {

                $file = file_get_contents($image_url);

                $filename = basename($image_url);

                //preg_match( '/(.*?)(\.\w+)$/', $filename, $match );

                $im_name = $filename;

                $res = wp_upload_bits($im_name, '', $file);

                $dirs = wp_upload_dir();

                $filetype = wp_check_filetype($file);

                $attachment = array(

                    'guid' => $dirs['baseurl'] . '/' . _wp_relative_upload_path($file) ,

                    'post_mime_type' => $filetype['type'],

                    'post_title' => preg_replace('/\.[^.]+$/', '', basename($file)) ,

                    //preg_replace 搜索并替换

                    'post_content' => '',

                    'post_status' => 'inherit'

                );

                $attach_id = wp_insert_attachment($attachment, $file, $id);

                $attach_data = wp_generate_attachment_metadata($attach_id, $file);

                //wp_generate_attachment_metadata

                wp_update_attachment_metadata($attach_id, $attach_data);

                //if($i==1 ){

                //set_post_thumbnail( $post_id, $attach_id );

                //}

                $replace = $res['url'];

                $content = str_replace($image_url, $replace, $content);

            }

            $i++;

        }

    }

    remove_filter('content_save_pre', 'post_save_images');

    return $content;

}

$current_user = wp_get_current_user();

if ($current_user->user_login == 'admin') { //只允许管理员使用本地化,因为前端编辑器使用会报错,使用前先填入自己的管理员用户名

    add_filter('content_save_pre', 'post_save_images');


————————————————



分享一个好用的WordPress图片自动本地化插件,有时候我们可能需要去摘抄网上的文章内容或者是公众号里发布的内容想要发布在wordpress里面,可能图片还是别人网站的或者是无法保存图片成功,一般都是做了防盗链类似的设置导致的。



这个插件可以轻松的把远程图片搬家到自己的服务器目录下,包括公众号文章里面的图片,所以感觉还挺好用的,分享一下。

插件名:nicen-localize-image

安装方法:直接在插件-搜索 nicen-localize-image

用于本地化文章的外部图片的插件,支持文章发布前通过编辑器插件本地化、文章发布时自动本地化、定时发布文章时自动本地化、已发布的文章批量本地化。

缺点不足:图片保存路径是固定目录,默认保存在/wp-content/uploads/replace,没有按照日期分目录自动保存,不过也不影响。



                           




标签: WordPress

添加新评论 »