diff --git a/README.md b/README.md index 67500e6..432382a 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,12 @@ nicen-localize-image,是一款用于本地化文章的外部图片的插件, # 更新日志: +## 1.3.91 + +1. 修复编辑器插件存在相同图片链接时,只会替换一次的问题 +2. 修复本地化图片验证图片链接状态码,没有模拟Referer导致触发防盗链,刚好链接返回异常状态码时,会本地化报错的问题。 +3. 新增本地化时是否记录日志的选项,关闭后将不在记录日志。 + ## 1.3.9 1. 修复分类名包含特殊字符时,批量本地化时,分类无法正常显示的问题 diff --git a/admin/preload.php b/admin/preload.php index ec6b0ec..594bd38 100644 --- a/admin/preload.php +++ b/admin/preload.php @@ -23,7 +23,7 @@ } } -const NICEN_VERSION = '1.3.9'; //插件版本 +const NICEN_VERSION = '1.3.91'; //插件版本 /* * 定时任务接口 * */ diff --git a/assets/admin.css b/assets/admin.css index c83d451..bedca72 100644 --- a/assets/admin.css +++ b/assets/admin.css @@ -1,19 +1,16 @@ @charset "UTF-8"; [v-cloak] { - display: none; -} + display: none; } #VueApp .ant-form-item-children dd, #VueApp .ant-form-item-children li { - margin-bottom: 0; -} + margin-bottom: 0; } #VueApp .info { line-height: 1.8; width: 150%; word-wrap: break-word; word-spacing: normal; - word-break: break-all; -} + word-break: break-all; } #VueApp .ant-input, #VueApp .ant-time-picker-input { box-sizing: border-box; @@ -33,121 +30,80 @@ background-image: none; border: 1px solid #d9d9d9; border-radius: 4px; - transition: all .3s; -} - -#VueApp .ant-input:focus, #VueApp .ant-time-picker-input:focus { - outline: 0 !important; - box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2) !important; -} - -#VueApp .ant-input:focus, #VueApp .ant-input:hover, #VueApp .ant-time-picker-input:focus, #VueApp .ant-time-picker-input:hover { - border-color: #40a9ff !important; - border-right-width: 1px !important; -} + transition: all .3s; } + #VueApp .ant-input:focus, #VueApp .ant-time-picker-input:focus { + outline: 0 !important; + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2) !important; } + #VueApp .ant-input:focus, #VueApp .ant-input:hover, #VueApp .ant-time-picker-input:focus, #VueApp .ant-time-picker-input:hover { + border-color: #40a9ff !important; + border-right-width: 1px !important; } #VueApp .ant-form-item { - margin-bottom: 15px; -} + margin-bottom: 15px; } #VueApp .card-container { background: #f5f5f5; overflow: hidden; - padding: 24px; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-bar { - border-color: #fff; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-bar .ant-tabs-tab { - border-color: transparent; - background: transparent; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-active { - border-color: #fff; - background: #fff; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content { - min-height: 150px; - margin-top: -16px; - /* VIP页面说明 */ -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip { - padding-bottom: 30px; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip .top { - color: red; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip .features { - list-style: decimal; - margin-top: 32px; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip .features .item { - display: flex; - justify-content: flex-start; - align-items: center; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip .features .item:after { - background-color: black; - border-radius: 50%; - padding: 0 6px; - margin-left: 10px; - font-size: 12px; - font-weight: bold; - color: white; - content: "×"; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip .features .ok:after { - background-color: #07c160; - border-radius: 50%; - padding: 0 6px; - margin-left: 10px; - font-size: 12px; - font-weight: bold; - color: white; - content: "√"; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip .bottom { - margin-top: 32px; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content > .ant-tabs-tabpane { - background: #fff; - padding: 36px 42px 10px 42px; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content .ant-form-item-label label { - display: flex; - align-items: center; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content .m-colorPicker { - display: inline-flex; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content .m-colorPicker .colorBtn { - width: 25px; - height: 25px; - border-radius: 50%; - margin-right: 15px; - cursor: pointer; - border: 1px solid #818181; -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content .m-colorPicker .box { - box-shadow: 0 0 15px 10px rgba(0, 0, 0, 0.15); -} - -#VueApp .card-container > .ant-tabs-card > .ant-tabs-content input { - background-color: inherit; -} + padding: 24px; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-bar { + border-color: #fff; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-bar .ant-tabs-tab { + border-color: transparent; + background: transparent; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-active { + border-color: #fff; + background: #fff; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content { + min-height: 150px; + margin-top: -16px; + /* VIP页面说明 */ } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip { + padding-bottom: 30px; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip .top { + color: red; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip .features { + list-style: decimal; + margin-top: 32px; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip .features .item { + display: flex; + justify-content: flex-start; + align-items: center; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip .features .item:after { + background-color: black; + border-radius: 50%; + padding: 0 6px; + margin-left: 10px; + font-size: 12px; + font-weight: bold; + color: white; + content: "×"; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip .features .ok:after { + background-color: #07c160; + border-radius: 50%; + padding: 0 6px; + margin-left: 10px; + font-size: 12px; + font-weight: bold; + color: white; + content: "√"; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content .vip .bottom { + margin-top: 32px; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content > .ant-tabs-tabpane { + background: #fff; + padding: 36px 42px 10px 42px; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content .ant-form-item-label label { + display: flex; + align-items: center; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content .m-colorPicker { + display: inline-flex; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content .m-colorPicker .colorBtn { + width: 25px; + height: 25px; + border-radius: 50%; + margin-right: 15px; + cursor: pointer; + border: 1px solid #818181; } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content .m-colorPicker .box { + box-shadow: 0 0 15px 10px rgba(0, 0, 0, 0.15); } + #VueApp .card-container > .ant-tabs-card > .ant-tabs-content input { + background-color: inherit; } diff --git a/class/local.php b/class/local.php index 8b19079..0f39b51 100644 --- a/class/local.php +++ b/class/local.php @@ -166,7 +166,7 @@ function localImage( $url, $flag = true ) { /* * 判断链接是否可以访问 * */ - if ( $this->getHttpcode( $url ) != 200 ) { + if ( $this->getImage( $url, true ) != 200 ) { if ( $flag ) { exit( json_encode( ( [ 'code' => 0, @@ -311,26 +311,13 @@ function getLink( $filename ) { return $link; } - /** - * 获取网站状态码 - * */ - function getHttpcode( $url ) { - $response = wp_remote_get( $url, [ - 'sslverify' => false, - 'timeout' => 60, - ] ); - $http_code = wp_remote_retrieve_response_code( $response ); - - return $http_code; - } - /** * 获取图片内容 * * @param $url string,图片的链接 + * @param bool $option ,获取状态码 * */ - function getImage( $url ) { - + function getImage( $url, $option = false ) { $link = parse_url( $url );//解析链接 /* @@ -347,10 +334,17 @@ function getImage( $url ) { $res = wp_remote_get( $url, [ 'headers' => $headers, 'sslverify' => false, - 'timeout' => 120, + 'timeout' => 180, ] ); - return wp_remote_retrieve_body( $res ); + /* + * 是否是状态码判断 + * */ + if ( $option ) { + return wp_remote_retrieve_response_code( $res ); + } else { + return wp_remote_retrieve_body( $res ); + } } /** @@ -405,5 +399,18 @@ function saveAsData( $filename ) { $attach_data = wp_generate_attachment_metadata( $attach_id, $filename ); wp_update_attachment_metadata( $attach_id, $attach_data ); } + + /** + * 获取网站状态码 + * */ + function getHttpcode( $url ) { + $response = wp_remote_get( $url, [ + 'sslverify' => false, + 'timeout' => 60, + ] ); + $http_code = wp_remote_retrieve_response_code( $response ); + + return $http_code; + } } diff --git a/class/log.php b/class/log.php index 8ea413c..1988a9f 100644 --- a/class/log.php +++ b/class/log.php @@ -10,11 +10,13 @@ class Nicen_Log { private static $self; private $option = 'nicen_plugin_error_log'; + private $record_log; //是否需要记录日志 private $logs; private function __construct() { add_option( $this->option );//初始化选项 - $this->logs = get_option( $this->option ); + $this->logs = get_option( $this->option ); + $this->record_log = get_option( 'nicen_make_plugin_record_log' ); } /** @@ -38,6 +40,10 @@ public static function getInstance() { */ public function add( $log ) { + if ( ! $this->record_log ) { + return $log; + } + $now = date( "Y-m-d H:i:s", time() ); /* diff --git a/config.php b/config.php index b7d2203..b44ebdc 100644 --- a/config.php +++ b/config.php @@ -54,7 +54,7 @@ 'title' => '功能设置说明', 'callback' => 'nicen_make_plugin_form_text', 'args' => [ - 'info' => '插件提供两种本地化外部图片的功能:
编辑器本地化插件】启用后会在文章编辑器上方显示一个小图标,点击之后可以自动检测并本地化所有外部图片;
发布时自动本地化】启用后会在文章发布时自动本地化所有外部图片;推荐使用【编辑器本地化插件】在发布前进行本地化,当图片数量过多或者文件太大【发布时自动本地化】可能会导致请求卡死。' + 'info' => '插件提供两种本地化外部图片的功能,本地化时自动跳过重复链接的图片:
编辑器本地化插件】启用后会在文章编辑器上方显示一个小图标,点击之后可以自动检测并本地化所有外部图片;
发布时自动本地化】启用后会在文章发布时自动本地化所有外部图片;推荐使用【编辑器本地化插件】在发布前进行本地化,当图片数量过多或者文件太大【发布时自动本地化】可能会导致请求卡死。
保存到数据库】启用后会将图片信息保存到数据库,可在媒体库内看到这张图片,同时会生成多张不同大小的内容一样图片。' ] ], [ @@ -251,6 +251,13 @@ 'callback' => [ "render" => "nicen_plugin_local_log" ], + 'fields' => [ + [ + 'id' => 'nicen_make_plugin_record_log', + 'title' => '本地化时记录日志', + 'callback' => 'nicen_make_form_switch', + ], + ] ], [ "id" => "nicen_make_plugin_update", @@ -302,6 +309,9 @@ /*白名单*/ 'nicen_make_publish_white' => '', + + /*插件日志*/ + 'nicen_make_plugin_record_log' => '1' ] ); diff --git a/nicen-localize-image.php b/nicen-localize-image.php index 21e87ce..2e6518d 100644 --- a/nicen-localize-image.php +++ b/nicen-localize-image.php @@ -3,7 +3,7 @@ * Plugin Name: nicen-localize-image * Plugin URI:https://nicen.cn/2893.html * Description: 用于本地化文章的外部图片的插件,支持文章发布前通过编辑器插件本地化、文章发布时自动本地化、定时发布文章时自动本地化、已发布的文章批量本地化。 - * Version: 1.3.9 + * Version: 1.3.91 * Author: 友人a丶 * Author URI: https://nicen.cn * Text Domain: nicen-localize-image diff --git a/readme.txt b/readme.txt index 8e4e8f3..3023bee 100644 --- a/readme.txt +++ b/readme.txt @@ -5,7 +5,7 @@ Donate link: https://nicen.cn/donate Requires at least: 5.6 Tested up to: 6.2 Requires PHP: 7.3 -Stable tag: 1.3.9 +Stable tag: 1.3.91 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html @@ -28,14 +28,20 @@ Gitee:https://gitee.com/friend-nicen/nicen-localize-image == Changelog == +v1.3.91 + +1. 修复编辑器插件存在相同图片链接时,只会替换一次的问题 +2. 修复本地化图片验证图片链接状态码,没有模拟Referer导致触发防盗链,刚好链接返回异常状态码时,会本地化报错的问题。 +3. 新增本地化时是否记录日志的选项,关闭后将不在记录日志。 + v1.3.9 -修复分类名包含特殊字符时,批量本地化时,分类无法正常显示的问题 -新增系统时间校准的功能开关,定时任务页面将展示当前系统时间和默认时区,避免由时区导致定时任务无法正常运行 -新增图片本地化后自动关联文章 -更新img匹配规则,兼容一些不规则的img标签 -修复开启图片本地化时保存到数据库功能后,本地化报错的问题 -优化插件后台的样式 +1. 修复分类名包含特殊字符时,批量本地化时,分类无法正常显示的问题 +2. 新增系统时间校准的功能开关,定时任务页面将展示当前系统时间和默认时区,避免由时区导致定时任务无法正常运行 +3. 新增图片本地化后自动关联文章 +4. 更新img匹配规则,兼容一些不规则的img标签 +5. 修复开启图片本地化时保存到数据库功能后,本地化报错的问题 +6. 优化插件后台的样式 v1.3.83 diff --git a/tinymcc/local.js b/tinymcc/local.js index f92bf40..d27585f 100644 --- a/tinymcc/local.js +++ b/tinymcc/local.js @@ -11,6 +11,20 @@ tinymce.create('tinymce.plugins.local', { init: function (ed, url) { + + /** + * 替换所有 + * @param old + * @param search + * @param re + */ + function replaceAll(old, search, re) { + while (old.indexOf(search) > -1) { + old = old.replace(search, re); + } + return old; + } + /* * 替换编辑器内容 * */ @@ -164,32 +178,38 @@ let code = await new Promise((resolve) => { - /* - * 请求服务器接口 - * */ - $.post('/?nicen_make_replace=1', { - private: POST_KEY, - img: i - }, function (res) { + try { - if (res.code === -1) { - layer.msg(res.result); - resolve(0); - } else if (res.code === 1) { - /* - * 替换变量里的内容 - * */ - content = content.replace(html2Escape(i), res.result); - } else { - number--; //未成功 - layer.msg(res.result); - } + /* + * 请求服务器接口 + * */ + $.post('/?nicen_make_replace=1', { + private: POST_KEY, + img: i + }, function (res) { - resolve(1); //退出本次任务 + if (res.code === -1) { + layer.msg(res.result); + resolve(0); + } else if (res.code === 1) { + /* + * 替换变量里的内容 + * */ + content = replaceAll(content, html2Escape(i), res.result); - }, 'json') + } else { + number--; //未成功 + layer.msg(res.result); + } + resolve(1); //退出本次任务 + + }, 'json'); + + } catch (e) { + resolve(0); //退出本次任务 + } })