WordPress如何自动将文章中复制粘贴的外链图片本地化到媒体库
我们在通过wp发布文章的时候,经常会从其他地方复制文章,而文章中通常会包含图片,那么如何在粘贴的时候自动本地化并上传图片到媒体库呢?
因为模板兔最近在为一个客户端开发一个自动本地化+自动水印+自动FTP上传到另一台服务器的功能,这里说明一下。
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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
/** * 钩子函数:将post_content中本站服务器域名外的img上传至服务器并替换url * * @param Int $post_id * @param Object $post * */ function ecp_save_post($post_id, $post) { // wordpress 全局变量 wpdb类 global $wpdb; // 只有在点击发布/更新时才执行以下动作 if($post->post_status == 'publish') { // 匹配<img>、src,存入$matches数组, $p = '/<img.*[\s]src=[\"|\'](.*)[\"|\'].*>/iU'; $num = preg_match_all($p, $post->post_content, $matches); if ($num) { // 本地上传路径信息(数组),用来构造url $wp_upload_dir = wp_upload_dir(); // 脚本执行不限制时间 set_time_limit(0); // 构造curl,配置参数 $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 抓取时如果发生301,302跳转,则进行跳转抓取 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 最多跳转20次 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) { // 如果图片域名不是本站域名 // 检查src中的url有无扩展名,没有则重新给定文件名 // 注意:如果url中有扩展名但格式为webp,那么返回的file_info数组为 ['ext' =>'','type' =>''] $file_info = wp_check_filetype(basename($src), null); if ($file_info['ext'] == false) { // 无扩展名和webp格式的图片会被作为无扩展名文件处理 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写入$img curl_setopt($ch, CURLOPT_FILE, $img); $img_data = curl_exec($ch); fclose($img); if (file_exists($file_path) && filesize($file_path) > 0) { // 将扩展名为tmp和webp的图片转换为jpeg文件并重命名 $t = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); $arr = explode('/', $t); // 对url地址中没有扩展名或扩展名为webp的图片进行处理 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'); } // 替换文章内容中的src $post->post_content = str_replace($src, $wp_upload_dir['url'] . '/' . basename($file_path), $post->post_content); // 构造附件post参数并插入媒体库(作为一个post插入到数据库) $attachment = ecp_get_attachment_post(basename($file_path), $wp_upload_dir['url'] . '/' . basename($file_path)); // 生成并更新图片的metadata信息 $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); // 直接调用wordpress函数,将metadata信息写入数据库 $ss = wp_update_attachment_metadata($attach_id, $attach_data); } } } curl_close($ch); // 更新posts数据表的post_content字段 $wpdb->update( $wpdb->posts, array('post_content' => $post->post_content), array('ID' => $post->ID)); } } } /** * 处理没有扩展名的图片:转换格式或更改扩展名 * @param string $file 图片本地绝对路径 * @param string $type 图片mimetype * @param string $file_dir 图片在本地的文件夹 * @param string $file_name 图片名称 * @param string $ext 图片扩展名 * @return string 处理后的本地图片绝对路径 */ 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) { // 将webp格式的图片转换为jpeg格式 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) { // 将webp格式的图片转换为jpeg格式 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; } } /** * 图片格式转换,暂只能从webp转换为jpeg * * @param string $from * @param string $to * @param string $image 图片本地绝对路径 * @return string 转换后的图片绝对路径 */ function ecp_image_convert($from='webp', $to='jpeg', $image) { // 加载 WebP 文件 $im = imagecreatefromwebp($image); // 以 100% 的质量转换成 jpeg 格式并将原webp格式文件删除 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); } /** * 构造图片post参数 * * @param string $filename * @param string $url * @return array 图片post参数数组 */ 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); |
只需将以上代码添加到主题的 functions.php 文件中,或者您可以直接安装插件 Easy copy paste
https://pan.baidu.com/s/1xYIyIN2sbAM19gD9b2n7jA?pwd=9mn4
由于网站搬家,部分链接失效,如无法下载,请联系站长!谢谢支持!
1. 带 [亲测] 说明源码已经被站长亲测过!
2. 下载后的源码请在24小时内删除,仅供学习用途!
3. 分享目的仅供大家学习和交流,请不要用于商业用途!
4. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
5. 本站所有资源来源于站长上传和网络,如有侵权请邮件联系站长!
6. 没带 [亲测] 代表站长时间紧促,站长会保持每天更新 [亲测] 源码 !
7. 盗版ripro用户购买ripro美化无担保,若设置不成功/不生效我们不支持退款!
8. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
9. 如果你也有好源码或者教程,可以到审核区发布,分享有金币奖励和额外收入!
10.如果您购买了某个产品,而我们还没来得及更新,请联系站长或留言催更,谢谢理解 !
GG资源网 » WordPress如何自动将文章中复制粘贴的外链图片本地化到媒体库
1. 带 [亲测] 说明源码已经被站长亲测过!
2. 下载后的源码请在24小时内删除,仅供学习用途!
3. 分享目的仅供大家学习和交流,请不要用于商业用途!
4. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
5. 本站所有资源来源于站长上传和网络,如有侵权请邮件联系站长!
6. 没带 [亲测] 代表站长时间紧促,站长会保持每天更新 [亲测] 源码 !
7. 盗版ripro用户购买ripro美化无担保,若设置不成功/不生效我们不支持退款!
8. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
9. 如果你也有好源码或者教程,可以到审核区发布,分享有金币奖励和额外收入!
10.如果您购买了某个产品,而我们还没来得及更新,请联系站长或留言催更,谢谢理解 !
GG资源网 » WordPress如何自动将文章中复制粘贴的外链图片本地化到媒体库