将WordPress文章中的外链图片自动下载到本地

释放双眼,带上耳机,听听看~!

WordPress很多插件或者代码都可以实现在编辑文章中自动将外链图片下载到本地,最终我选择了一个叫:Easy Copy Paste的插件。

d4c3a-123-1

大家可以自己后台下载下,我这里在提供一个代码版:
更容易使用~
加到当前主题函数模板 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_path, 'wb');
          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_path, PATHINFO_EXTENSION) == 'tmp') {
              $file_path = ecp_handle_ext($file_path, $arr[1], $wp_upload_dir['path'], $file_name, 'tmp');
            }
            elseif(pathinfo($file_path, PATHINFO_EXTENSION) == 'webp') {
              $file_path = ecp_handle_ext($file_path, $arr[1], $wp_upload_dir['path'], $file_name, 'webp');
            }
            $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) {
  switch ($ext) {
  case 'tmp':
    if (rename($file, str_replace('tmp', $type, $file))) {
      if ('webp' == $type) {
        return ecp_image_convert('webp', 'jpeg', $file_dir.'/'.str_replace('tmp', $type, $file_name));
      }
      return $file_dir.'/'.str_replace('tmp', $type, $file_name);
    }
  case 'webp':
    if ('webp' == $type) {
      return ecp_image_convert('webp', 'jpeg', $file);
    } else {
      if (rename($file, str_replace('webp', $type, $file))) {
        return $file_dir.'/'.str_replace('webp', $type, $file_name);
      }
    }
  default:
    return $file;
  }
}
function ecp_image_convert($from = 'webp', $to = 'jpeg', $image) {
  $im = imagecreatefromwebp($image);
  if (imagejpeg($im, str_replace('webp', 'jpeg', $image), 100)) {
    try {
      unlink($image);
    } catch(Exception $e) {
      $error_msg = sprintf('Error removing local file %s: %s', $image, $e - >getMessage());
      error_log($error_msg);
    }
  }
  imagedestroy($im);
  return str_replace('webp', 'jpeg', $image);
}
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_post', 'ecp_save_post', 120, 2);

 

单篇操作
之后,编辑文章只需要点击更新按钮,就可以将文章中的外链图片下载到本地并替换链接。

不过逐个编辑文章不仅繁琐而且工作量不小,这里教大家一个小技巧,可以批量下载文章中的外链图片。

批量操作
该插件的代码不仅可以在正常的编辑页面点击更新按钮触发下载功能,而且可以在后台所有文章列表页面中触发下载图片功能,原理明白了,操作就简单了。

进入WP后台,文章→所有文章,进入文章管理页面,勾选“标题”全选当前页面的所有文章,并选择“编辑”,并点击“应用”按钮。
切记,不要更改批量编辑中的任何设置,只需单击 “更新”即可。

这个过程将触发检查所有选定的文章,并自动下载外链图片!

温馨提示:本文最后更新于 2022-12-11 01:48 ,某些文章具有时效性,若有错误或已失效,请在下方留言或联系逆念

给TA打赏
共{{data.count}}人
人已打赏
网络技术

WordPress网站添加一个时光轴页面

2022-4-25 16:45:52

网络技术

WordPress不支持svg/ico/webp上传怎么办?

2022-4-25 16:55:22

重要声明

本站资源大多来自网络,如有侵犯你的权益请联系管理员,QQ508044570 我们会第一时间进行审核删除。站内资源为网友个人学习或测试研究使用,未经原版权作者许可,禁止用于任何商业途径!请在下载24小时内删除!


如果遇到付费才可观看的文章,建议升级终身VIP。全站所有资源任意下免费看”。本站资源少部分采用7z压缩,为防止有人压缩软件不支持7z格式,7z解压,建议下载7-zip,zip、rar解压,建议下载WinRAR

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索