PHP插件实现wordpress外链图片本地化

此PHP代码实现在发布文章时自动抓取外链图片并下载到本地,然后重新上传并替换图片链接。

以下代码注释丰富,有需要的可以仔细阅读。

<?php
/*
Plugin Name: 外链图片本地化
Description: 在发布文章时自动抓取外链图片并下载到本地,然后重新上传并替换图片链接。
Version: 1.1
*/

// 添加发布文章的钩子
add_action('save_post', 'auto_download_replace_images');

//下载图片并且替换
function auto_download_replace_images($post_id) {
     // 检查是否是自动保存的文章,如果是,就不执行
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) 
        return;
    
    // 获取文章内容
    $post_content = get_post_field('post_content', $post_id);

    // 使用正则表达式匹配文章内容中的外链图片
    preg_match_all('/<img.*?src=["\'](https?:\/\/.*?)["\'].*?>/i', $post_content, $matches);

    // 遍历匹配的图片链接
    foreach ($matches[1] as $image_url) {
        // 验证图片链接的来源并且下载到本地
        if (wp_http_validate_url($image_url)) {
            $upload = auto_download_image($image_url);

        // 如果下载成功,就替换文章内容中的图片链接
            if ($upload) {
                $post_content = str_replace($image_url, $upload['url'], $post_content);
            }
        }
    }

    // 移除保存文章时的钩子,以免进入无限循环
    remove_action('save_post', 'auto_download_replace_images');

    // 更新文章内容
    wp_update_post(array(
        'ID'           => $post_id,
        'post_content' => $post_content,
    ));

    // 重新添加保存文章的钩子
    add_action('save_post', 'auto_download_replace_images');
}

//负责图片下载的具体执行
function auto_download_image($image_url) {
    // 检查是否已经下载过这张图片,如果下载过就直接返回
    $attachment_id = attachment_url_to_postid($image_url);
    if ($attachment_id) {
        $attachment_url = wp_get_attachment_url($attachment_id);
        return array(
            'id'  => $attachment_id,
            'url' => $attachment_url,
        );
    }

    // 生成本地文件名
    $file_name = basename($image_url);
    
    // 生成新的文件名,基于当前时间和随机数
    $new_file_name = md5(time() . rand()) . '_' . $file_name;

    // 使用WordPress HTTP API下载到本地
    $response = wp_safe_remote_get($image_url);
    if (!is_wp_error($response) && $response['response']['code'] === 200) {
        $upload = wp_upload_bits($new_file_name, null, $response['body']);

   // 如果上传成功,就把图片添加到媒体库
        if (!$upload['error']) {
            $file_path = $upload['file'];
            $attachment = array(
                'post_mime_type' => wp_check_filetype($file_name)['type'],
                'post_title'     => sanitize_file_name($file_name),
                'post_content'   => '',
                'post_status'    => 'inherit',
            );
            
            // 添加到媒体库
            $attachment_id = wp_insert_attachment($attachment, $file_path);
            
            // 更新媒体库
            require_once(ABSPATH . 'wp-admin/includes/image.php');
            $attachment_data = wp_generate_attachment_metadata($attachment_id, $file_path);
            wp_update_attachment_metadata($attachment_id, $attachment_data);
            
            // 返回新的图片链接信息
            $attachment_url = wp_get_attachment_url($attachment_id);
            return array(
                'id'  => $attachment_id,
                'url' => $attachment_url,
            );
        }
    }

    return false;
}

 

发表评论