天涯论坛

 找回密码
 立即注册
搜索
查看: 13|回复: 2

纯代码将 WordPress 文案外链照片备份为网站媒介库本地内链照片

[复制链接]

3136

主题

3万

回帖

9996万

积分

论坛元老

Rank: 8Rank: 8

积分
99968632
发表于 2024-11-1 10:57:18 | 显示全部楼层 |阅读模式

咱们的 WordPress 网站在运用了图床,复制粘贴了别人网站内容的状况下,文案中会显现有些外边照片位置)。倘若运用的图床停止服务(尤其是白嫖的免费图床),别人的网站挂了,就会引起咱们网站文案中的外链照片随之失效,没法表示

此时,倘若提前备份了照片还好,重新上传批量替换位置什么的就能够了,无非便是麻烦有些。但倘若照片备份,那就糟糕了,重新给所有文案配图可不是一件容易的事。

那样怎样避免这个问题呢?最保险的做法自然是将文案中的外边照片,下载并保留到 WordPress 媒介库,并将文案中的照片链接替换为本地服务器的照片链接。实现很简单,无需安装插件,直接将下方代码加入到主题 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_pathwb

);

                    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_pathATHINFO_EXTENSION) == tmp

) {

                            $file_path = ecp_handle_ext($file_path$arr[1], $wp_upload_dir[path], $file_nametmp

);

                        }

                        $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

) {

    if ($ext === tmp

) {

        if (rename($file, str_replace(tmp$type$file

))) {

            return $file_dir . / . str_replace(tmp$type$file_name

);

        }

    }

    return $file

;

}

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_postecp_save_post

, 120, 2);

不外有这种状况需要:网站运用了国外服务器,但把照片放在国内服务器上(如利用国内大厂的某些服务当作免费图床)以提高加载速度。因此呢期盼能够暂时运用国内的照片外链,只是先将外链照片提前备份到媒介库。当某天万一外链照片挂了,再替换成内链照片

怎样实现呢?下面供给两段代码,任选其一就可。代码 1 是在以上代码基本上修改而来。

保持原外链照片文件名和格式再也不自动重命名上传的照片仅上传外链照片媒介再也不自动替换文案中的照片链接位置

代码 1

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

) {

                    $attachment_id= attachment_url_to_postid($src

);

                    if ($attachment_id

) {

                        continue

;

                    }

                    $file_name = basename($src

);

                    $file_path = $wp_upload_dir[path] . / . $file_name

;

                    if (file_exists($file_path

)) {

                        continue

;

                    }

                    curl_setopt($ch, CURLOPT_URL, $src

);

                    $img = fopen($file_pathwb

);

                    curl_setopt($ch, CURLOPT_FILE, $img

);

                    $img_data = curl_exec($ch

);

fclose($img

);

                    if (file_exists($file_path) && filesize($file_path

) > 0) {

                        $attachment = ecp_get_attachment_post($file_name$wp_upload_dir[url] . / . $file_name

);

                        $attach_id = wp_insert_attachment($attachment$file_path

, 0);

                        $attach_data = wp_generate_attachment_metadata($attach_id$file_path

);

wp_update_attachment_metadata($attach_id$attach_data

);

                    }

                }

            }

            curl_close($ch

);

        }

    }

}

function ecp_get_attachment_post($filename$url

) {

    $file_info = wp_check_filetype($filename

, null);

    return

 array(

        guid => $url

,

        post_type => attachment

,

        post_mime_type => $file_info[type

],

        post_title => preg_replace(/\.[^.]+$/, , $filename

),

        post_content

 => ,

        post_status => inherit

    );

}

add_action(save_postecp_save_post

, 120, 2);

代码 2

function backup_external_images_to_media_library( $post_id

 ) {

    $post = get_post( $post_id

 );

    $content = $post

->post_content;

    preg_match_all( /<img[^>]+src="([^">]+)"/i$content$matches

 );

    if ( isset( $matches[1] ) && !empty( $matches

[1] ) ) {

foreach ($matches[1] as $image_url

 ) {

            if ( strpos( $image_url, home_url() ) === false

 ) {

                $attachment_id = attachment_url_to_postid( $image_url

 );

                if ( !$attachment_id

) {

                    $upload = upload_image_to_media_library_without_replacement( $image_url

 );

                    if ( $upload && !is_wp_error( $upload

 ) ) {

                    }

                }

            }

        }

    }

}

functionupload_image_to_media_library_without_replacement($image_url

 ) {

    $image_data = file_get_contents( $image_url

 );

    if ( !$image_data

 ) {

        return new WP_Error( image_download_failed, __( Failed to download image.text-domain

 ) );

    }

    $filename = basename( parse_url( $image_url

HP_URL_PATH ) );

    $upload_dir

 = wp_upload_dir();

    $upload_path = $upload_dir[path] . / . $filename

;

    if ( file_exists( $upload_path

 ) ) {

        return false

;

    }

    if ( !file_put_contents( $upload_path$image_data

 ) ) {

        return new WP_Error( image_save_failed, __( Failed to save image.text-domain

 ) );

    }

    $file_type = wp_check_filetype( $filename

, null );

    $attachment

 = array(

        guid           => $upload_dir[url] . / . basename( $filename

 ),

        post_mime_type => $file_type[type

],

        post_title     => sanitize_file_name( $filename

 ),

        post_content

   => ,

        post_status    => inherit

,

    );

    $attachment_id= wp_insert_attachment($attachment$upload_path

 );

    if ( !is_wp_error( $attachment_id

 ) ) {

        require_once( ABSPATH . wp-admin/includes/image.php

 );

        $attachment_data= wp_generate_attachment_metadata($attachment_id$upload_path

 );

        wp_update_attachment_metadata( $attachment_id$attachment_data

 );

        return

 array(

            id  => $attachment_id

,

            url => wp_get_attachment_url( $attachment_id

 ),

        );

    }

    return false

;

}

add_action( save_postbackup_external_images_to_media_library

 );

哪段代码更好?

代码 1优良在于它运用了 cURL,能够更好地处理繁杂的网络请求,如大照片下载、重定向等场景。倘若需要处理更加多不确定性原因(如外边服务器响应时间较长、繁杂的重定向状况),第1段代码可能更适合,但需要更繁杂守护和优化。

代码 2更加简洁、易读、模块化,且错误处理更清晰,适合大都数平常场景。它的实现更符合现代编程习惯,代码守护性较好。倘若特殊的超时或重定向处理需要,它的实现方式较优。

因此呢倘若目的简单的下载和备份外边照片举荐运用 代码 2由于它更加简洁,且易于扩展和守护倘若需要处理更加多繁杂的网络请求,如跨站点的大文件下载或重定向,代码 1 的 cURL 方式可能更适合。

最后,倘若仅仅先备份照片媒介库,小白意见不要在内链照片位置包括年份和月份(日期),以方便以后替换链接。只需要在 WordPress 网站后台 - 设置 - 媒介 -  文件上传,取消勾选”以年—月目录形式组织上传内容“就能够了。





上一篇:外链图床已限制照片外链运用(附处理办法)
下一篇:怎么样创建wish照片外链
回复

使用道具 举报

3069

主题

2万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99138952
发表于 2024-11-1 13:05:12 | 显示全部楼层
期待与你深入交流,共探知识的无穷魅力。
回复

使用道具 举报

3059

主题

2万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99139060
发表于 2024-11-9 20:06:37 | 显示全部楼层
顶楼主,说得太好了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-22 17:52 , Processed in 0.158523 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.