Compare commits

..

No commits in common. "master" and "v1.4.13" have entirely different histories.

6 changed files with 94 additions and 204 deletions

View File

@ -1,10 +1,6 @@
/.git /.git
/.github /.github
/.distignore /.distignore
/.wordpress-org
/sdk/composer.lock /sdk/composer.lock
/sdk/vendor/aliyuncs/oss-sdk-php/samples/ /sdk/vendor/aliyuncs/oss-sdk-php/samples/
/sdk/vendor/aliyuncs/oss-sdk-php/tests/ /sdk/vendor/aliyuncs/oss-sdk-php/tests/
/sdk/vendor/aliyuncs/oss-sdk-php/.coveralls.yml
*.github
*.php_cs*

View File

@ -22,11 +22,9 @@
- [x] 支持同步历史附件到阿里云对象存储 OSS - [x] 支持同步历史附件到阿里云对象存储 OSS
- [x] 支持阿里云 OSS 图片处理 - [x] 支持阿里云 OSS 图片处理
- [x] 支持上传文件自动重命名 - [x] 支持上传文件自动重命名
- [x] 支持使用 ECS 的 RAM 操作 - [x] 支持使用 RAM 操作
- [x] 支持原图保护 - [x] 支持原图保护
- [x] 支持 `wp-cli` 命令上传/删除文件 - [x] 支持 `wp-cli` 命令上传文件
- [x] 支持多站点
- [x] 支持图片裁剪编辑等操作后的上传
## 安装 ## 安装

View File

@ -2,8 +2,8 @@
/* /*
Plugin Name: OSS Aliyun Plugin Name: OSS Aliyun
Plugin URI: https://github.com/sy-records/aliyun-oss-wordpress Plugin URI: https://github.com/sy-records/aliyun-oss-wordpress
Description: 使用阿里云对象存储 OSS 作为附件存储空间。(This is a plugin that uses Aliyun Object Storage Service for attachments remote saving.) Description: 使用阿里云对象存储 OSS 作为附件存储空间。This is a plugin that uses Aliyun Object Storage Service for attachments remote saving.
Version: 1.5.1 Version: 1.4.13
Author: 沈唁 Author: 沈唁
Author URI: https://qq52o.me Author URI: https://qq52o.me
License: Apache2.0 License: Apache2.0
@ -18,9 +18,8 @@ use OSS\OssClient;
use OSS\Credentials\CredentialsProvider; use OSS\Credentials\CredentialsProvider;
use AlibabaCloud\Credentials\Credential; use AlibabaCloud\Credentials\Credential;
use OSS\Credentials\StaticCredentialsProvider; use OSS\Credentials\StaticCredentialsProvider;
use OSS\Core\OssException;
define('OSS_VERSION', '1.5.1'); define('OSS_VERSION', '1.4.13');
define('OSS_BASEFOLDER', plugin_basename(dirname(__FILE__))); define('OSS_BASEFOLDER', plugin_basename(dirname(__FILE__)));
if (!function_exists('get_home_path')) { if (!function_exists('get_home_path')) {
@ -54,12 +53,12 @@ class OSSCredentialsWrapper implements CredentialsProvider
// 初始化选项 // 初始化选项
register_activation_hook(__FILE__, 'oss_set_options'); register_activation_hook(__FILE__, 'oss_set_options');
function oss_get_default_options() // 初始化选项
function oss_set_options()
{ {
return [ $options = [
'bucket' => '', 'bucket' => '',
'regional' => 'oss-cn-shanghai', 'regional' => 'oss-cn-shanghai',
'origin_region' => '',
'accessKeyId' => '', 'accessKeyId' => '',
'accessKeySecret' => '', 'accessKeySecret' => '',
'is_internal' => 'false', 'is_internal' => 'false',
@ -69,78 +68,50 @@ function oss_get_default_options()
'style' => '', // 图片处理 'style' => '', // 图片处理
'update_file_name' => 'false', // 是否重命名文件名 'update_file_name' => 'false', // 是否重命名文件名
'role_name' => '', // 角色名称 'role_name' => '', // 角色名称
'origin_protect' => 'off', 'origin_protect' => '',
]; ];
} add_option('oss_options', $options, '', 'yes');
// 初始化选项
function oss_set_options()
{
add_option('oss_options', oss_get_default_options(), '', 'yes');
} }
function oss_get_client() function oss_get_client()
{ {
$oss_options = get_option('oss_options', oss_get_default_options()); $oss_opt = get_option('oss_options', true);
$role_name = esc_attr($oss_options['role_name'] ?? ''); $roleName = esc_attr($oss_opt['role_name'] ?? '');
$endpoint = oss_get_bucket_endpoint($oss_options); $endpoint = oss_get_bucket_endpoint($oss_opt);
if (!empty($role_name)) { if (!empty($roleName)) {
$ecsRamRole = new Credential([ $ecsRamRole = new Credential([
// 填写Credential类型固定值为ecs_ram_role。 // 填写Credential类型固定值为ecs_ram_role。
'type' => 'ecs_ram_role', 'type' => 'ecs_ram_role',
// 填写角色名称。 // 填写角色名称。
'role_name' => $role_name, 'role_name' => $roleName,
]); ]);
$providerWrapper = new OSSCredentialsWrapper($ecsRamRole); $providerWrapper = new OSSCredentialsWrapper($ecsRamRole);
$provider = $providerWrapper->getCredentials(); $provider = $providerWrapper->getCredentials();
} else { $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? 'https://' : 'http://';
$provider = new StaticCredentialsProvider(esc_attr($oss_options['accessKeyId']), esc_attr($oss_options['accessKeySecret'])); $config = ['provider' => $provider, 'endpoint'=> $protocol . $endpoint];
return new OssClient($config);
} }
$region = !empty($oss_options['origin_region']) ? esc_attr($oss_options['origin_region']) : esc_attr($oss_options['regional']); $accessKeyId = esc_attr($oss_opt['accessKeyId']);
if (in_array($region, ['oss-accelerate', 'oss-accelerate-overseas']) && empty($oss_options['origin_region'])) { $accessKeySecret = esc_attr($oss_opt['accessKeySecret']);
try { return new OssClient($accessKeyId, $accessKeySecret, $endpoint);
$config = [
'provider' => $provider,
'endpoint' => $region == 'oss-accelerate' ? 'https://oss-cn-hangzhou.aliyuncs.com' : 'https://oss-cn-hongkong.aliyuncs.com',
'signatureVersion' => OssClient::OSS_SIGNATURE_VERSION_V4,
'region' => $region == 'oss-accelerate' ? 'cn-hangzhou' : 'cn-hongkong',
];
$region = (new OssClient($config))->getBucketInfo(esc_attr($oss_options['bucket']))->getLocation();
$oss_options['origin_region'] = sanitize_text_field($region);
update_option('oss_options', $oss_options);
} catch (OssException $e) {
error_log("get bucket location failed: {$e->getMessage()}");
}
}
$region = str_replace('oss-', '', $region);
$config = [
'provider' => $provider,
'endpoint' => $endpoint,
'signatureVersion' => OssClient::OSS_SIGNATURE_VERSION_V4,
'region' => $region,
];
return new OssClient($config);
} }
function oss_get_bucket_endpoint($oss_options) function oss_get_bucket_endpoint($oss_option)
{ {
$regional = esc_attr($oss_options['regional']); $oss_regional = esc_attr($oss_option['regional']);
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || (!empty($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) ? 'https' : 'http'; if ($oss_option['is_internal'] == 'true') {
if ($oss_options['is_internal'] == 'true') { return "{$oss_regional}-internal.aliyuncs.com";
return "{$protocol}://{$regional}-internal.aliyuncs.com";
} }
return "{$protocol}://{$regional}.aliyuncs.com"; return "{$oss_regional}.aliyuncs.com";
} }
function oss_get_bucket_name() function oss_get_bucket_name()
{ {
$oss_options = get_option('oss_options', oss_get_default_options()); $oss_opt = get_option('oss_options', true);
return esc_attr($oss_options['bucket']); return $oss_opt['bucket'];
} }
/** /**
@ -193,7 +164,7 @@ function oss_file_upload($object, $file, $no_local_file = false)
*/ */
function oss_is_delete_local_file() function oss_is_delete_local_file()
{ {
$oss_options = get_option('oss_options', oss_get_default_options()); $oss_options = get_option('oss_options', true);
return esc_attr($oss_options['nolocalsaving']) == 'true'; return esc_attr($oss_options['nolocalsaving']) == 'true';
} }
@ -266,7 +237,7 @@ function oss_delete_oss_files(array $files)
*/ */
function oss_upload_attachments($metadata) function oss_upload_attachments($metadata)
{ {
$mime_types = wp_get_mime_types(); $mime_types = get_allowed_mime_types();
$image_mime_types = [ $image_mime_types = [
$mime_types['jpg|jpeg|jpe'], $mime_types['jpg|jpeg|jpe'],
$mime_types['gif'], $mime_types['gif'],
@ -275,6 +246,7 @@ function oss_upload_attachments($metadata)
$mime_types['tiff|tif'], $mime_types['tiff|tif'],
$mime_types['webp'], $mime_types['webp'],
$mime_types['ico'], $mime_types['ico'],
$mime_types['heic'],
]; ];
// 例如mp4等格式 上传后根据配置选择是否删除 删除后媒体库会显示默认图片 点开内容是正常的 // 例如mp4等格式 上传后根据配置选择是否删除 删除后媒体库会显示默认图片 点开内容是正常的
// 图片在缩略图处理 // 图片在缩略图处理
@ -312,7 +284,7 @@ function oss_upload_thumbs($metadata)
$upload_path = oss_get_option('upload_path'); $upload_path = oss_get_option('upload_path');
//获取oss插件的配置信息 //获取oss插件的配置信息
$oss_options = get_option('oss_options', oss_get_default_options()); $oss_options = get_option('oss_options', true);
$no_local_file = esc_attr($oss_options['nolocalsaving']) == 'true'; $no_local_file = esc_attr($oss_options['nolocalsaving']) == 'true';
$no_thumb = esc_attr($oss_options['nothumb']) == 'true'; $no_thumb = esc_attr($oss_options['nothumb']) == 'true';
@ -395,11 +367,12 @@ if (substr_count($_SERVER['REQUEST_URI'], '/update.php') <= 0) {
*/ */
function oss_delete_remote_attachment($post_id) function oss_delete_remote_attachment($post_id)
{ {
$wp_uploads = wp_upload_dir();
$basedir = $wp_uploads['basedir'];
$upload_path = str_replace(get_home_path(), '', $basedir);
// 获取图片类附件的meta信息 // 获取图片类附件的meta信息
$meta = wp_get_attachment_metadata($post_id); $meta = wp_get_attachment_metadata($post_id);
$upload_path = oss_get_option('upload_path');
if ($upload_path == '') {
$upload_path = 'wp-content/uploads';
}
if (!empty($meta['file'])) { if (!empty($meta['file'])) {
$deleteObjects = []; $deleteObjects = [];
@ -422,13 +395,6 @@ function oss_delete_remote_attachment($post_id)
} }
} }
$backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
if (is_array($backup_sizes)) {
foreach ($backup_sizes as $size) {
$deleteObjects[] = $dirname . $size['file'];
}
}
oss_delete_oss_files($deleteObjects); oss_delete_oss_files($deleteObjects);
} else { } else {
// 获取链接删除 // 获取链接删除
@ -440,7 +406,7 @@ function oss_delete_remote_attachment($post_id)
oss_delete_oss_file($upload_path . end($file_info)); oss_delete_oss_file($upload_path . end($file_info));
} }
} else { } else {
$oss_options = get_option('oss_options', oss_get_default_options()); $oss_options = get_option('oss_options', true);
$oss_upload_url = esc_attr($oss_options['upload_url_path']); $oss_upload_url = esc_attr($oss_options['upload_url_path']);
$file_info = explode($oss_upload_url, $link); $file_info = explode($oss_upload_url, $link);
if (count($file_info) >= 2) { if (count($file_info) >= 2) {
@ -453,19 +419,19 @@ function oss_delete_remote_attachment($post_id)
add_action('delete_attachment', 'oss_delete_remote_attachment'); add_action('delete_attachment', 'oss_delete_remote_attachment');
// 当upload_path为根目录时需要移除URL中出现的“绝对路径” // 当upload_path为根目录时需要移除URL中出现的“绝对路径”
function oss_modify_img_url($url, $post_id) function oss_modefiy_img_url($url, $post_id)
{ {
// 移除 ./ 和 项目根路径 // 移除 ./ 和 项目根路径
return str_replace(['./', get_home_path()], '', $url); return str_replace(['./', get_home_path()], '', $url);
} }
if (oss_get_option('upload_path') == '.') { if (oss_get_option('upload_path') == '.') {
add_filter('wp_get_attachment_url', 'oss_modify_img_url', 30, 2); add_filter('wp_get_attachment_url', 'oss_modefiy_img_url', 30, 2);
} }
function oss_sanitize_file_name($filename) function oss_sanitize_file_name($filename)
{ {
$oss_options = get_option('oss_options', oss_get_default_options()); $oss_options = get_option('oss_options');
switch ($oss_options['update_file_name']) { switch ($oss_options['update_file_name']) {
case 'md5': case 'md5':
return md5($filename) . '.' . pathinfo($filename, PATHINFO_EXTENSION); return md5($filename) . '.' . pathinfo($filename, PATHINFO_EXTENSION);
@ -529,7 +495,7 @@ add_filter('plugin_action_links', 'oss_plugin_action_links', 10, 2);
function oss_custom_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id) function oss_custom_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id)
{ {
$option = get_option('oss_options', oss_get_default_options()); $option = get_option('oss_options');
$style = !empty($option['style']) ? esc_attr($option['style']) : ''; $style = !empty($option['style']) ? esc_attr($option['style']) : '';
$upload_url_path = esc_attr($option['upload_url_path']); $upload_url_path = esc_attr($option['upload_url_path']);
if (empty($style)) { if (empty($style)) {
@ -537,9 +503,6 @@ function oss_custom_image_srcset($sources, $size_array, $image_src, $image_meta,
} }
foreach ($sources as $index => $source) { foreach ($sources as $index => $source) {
if (!isset($source['url']) || !oss_is_image_type($source['url'])) {
continue;
}
if (strpos($source['url'], $upload_url_path) !== false && strpos($source['url'], $style) === false) { if (strpos($source['url'], $upload_url_path) !== false && strpos($source['url'], $style) === false) {
$sources[$index]['url'] .= $style; $sources[$index]['url'] .= $style;
} }
@ -570,7 +533,7 @@ function oss_wp_prepare_attachment_for_js($response)
add_filter('the_content', 'oss_setting_content_style'); add_filter('the_content', 'oss_setting_content_style');
function oss_setting_content_style($content) function oss_setting_content_style($content)
{ {
$option = get_option('oss_options', oss_get_default_options()); $option = get_option('oss_options');
$upload_url_path = esc_attr($option['upload_url_path']); $upload_url_path = esc_attr($option['upload_url_path']);
if (!empty($option['style'])) { if (!empty($option['style'])) {
$style = esc_attr($option['style']); $style = esc_attr($option['style']);
@ -578,9 +541,6 @@ function oss_setting_content_style($content)
if (!empty($images) && isset($images[1])) { if (!empty($images) && isset($images[1])) {
$images[1] = array_unique($images[1]); $images[1] = array_unique($images[1]);
foreach ($images[1] as $item) { foreach ($images[1] as $item) {
if (!oss_is_image_type($item)) {
continue;
}
if (strpos($item, $upload_url_path) !== false && strpos($item, $style) === false) { if (strpos($item, $upload_url_path) !== false && strpos($item, $style) === false) {
$content = str_replace($item, $item . $style, $content); $content = str_replace($item, $item . $style, $content);
} }
@ -595,7 +555,7 @@ function oss_setting_content_style($content)
add_filter('post_thumbnail_html', 'oss_setting_post_thumbnail_style', 10, 3); add_filter('post_thumbnail_html', 'oss_setting_post_thumbnail_style', 10, 3);
function oss_setting_post_thumbnail_style($html, $post_id, $post_image_id) function oss_setting_post_thumbnail_style($html, $post_id, $post_image_id)
{ {
$option = get_option('oss_options', oss_get_default_options()); $option = get_option('oss_options');
$upload_url_path = esc_attr($option['upload_url_path']); $upload_url_path = esc_attr($option['upload_url_path']);
if (!empty($option['style']) && has_post_thumbnail()) { if (!empty($option['style']) && has_post_thumbnail()) {
$style = esc_attr($option['style']); $style = esc_attr($option['style']);
@ -603,9 +563,6 @@ function oss_setting_post_thumbnail_style($html, $post_id, $post_image_id)
if (!empty($images) && isset($images[1])) { if (!empty($images) && isset($images[1])) {
$images[1] = array_unique($images[1]); $images[1] = array_unique($images[1]);
foreach ($images[1] as $item) { foreach ($images[1] as $item) {
if (!oss_is_image_type($item)) {
continue;
}
if (strpos($item, $upload_url_path) !== false && strpos($item, $style) === false) { if (strpos($item, $upload_url_path) !== false && strpos($item, $style) === false) {
$html = str_replace($item, $item . $style, $html); $html = str_replace($item, $item . $style, $html);
} }
@ -617,11 +574,6 @@ function oss_setting_post_thumbnail_style($html, $post_id, $post_image_id)
return $html; return $html;
} }
/**
* @link https://help.aliyun.com/zh/oss/user-guide/regions-and-endpoints
* @param string $regional
* @return void
*/
function oss_get_regional($regional) function oss_get_regional($regional)
{ {
$options = [ $options = [
@ -665,7 +617,7 @@ function oss_get_regional($regional)
foreach ($options as $value => $text) { foreach ($options as $value => $text) {
$selected = ($regional == $value) ? 'selected="selected"' : ''; $selected = ($regional == $value) ? 'selected="selected"' : '';
echo "<option value='{$value}' {$selected}>{$text}</option>"; echo "<option value=\"{$value}\" {$selected}>{$text}</option>";
} }
} }
@ -674,7 +626,7 @@ function oss_get_option($key)
return esc_attr(get_option($key)); return esc_attr(get_option($key));
} }
$oss_options = get_option('oss_options', oss_get_default_options()); $oss_options = get_option('oss_options', true);
if (!empty($oss_options['origin_protect']) && esc_attr($oss_options['origin_protect']) === 'on' && !empty(esc_attr($oss_options['style']))) { if (!empty($oss_options['origin_protect']) && esc_attr($oss_options['origin_protect']) === 'on' && !empty(esc_attr($oss_options['style']))) {
add_filter('wp_get_attachment_url', 'oss_add_suffix_to_attachment_url', 10, 2); add_filter('wp_get_attachment_url', 'oss_add_suffix_to_attachment_url', 10, 2);
add_filter('wp_get_attachment_thumb_url', 'oss_add_suffix_to_attachment_url', 10, 2); add_filter('wp_get_attachment_thumb_url', 'oss_add_suffix_to_attachment_url', 10, 2);
@ -746,7 +698,7 @@ function oss_add_suffix_for_media_send_to_editor($data)
*/ */
function oss_is_image_type($url) function oss_is_image_type($url)
{ {
return (bool) preg_match('/\.(jpg|jpeg|jpe|png|bmp|webp|heic|heif|svg)$/i', $url); return (bool) preg_match('/\.(jpg|jpeg|jpe|gif|png|bmp|webp|heic|heifsvg)$/i', $url);
} }
/** /**
@ -754,7 +706,7 @@ function oss_is_image_type($url)
*/ */
function oss_get_image_style() function oss_get_image_style()
{ {
$oss_options = get_option('oss_options', oss_get_default_options()); $oss_options = get_option('oss_options', true);
return esc_attr($oss_options['style']); return esc_attr($oss_options['style']);
} }
@ -773,15 +725,13 @@ function oss_setting_page()
if (!current_user_can('manage_options')) { if (!current_user_can('manage_options')) {
wp_die('Insufficient privileges!'); wp_die('Insufficient privileges!');
} }
if (!empty($_POST) && !empty($_POST['type'])) { $options = [];
$nonce = $_POST["{$_POST['type']}-nonce"] ?? ''; if (!empty($_POST) and $_POST['type'] == 'oss_set') {
if (empty($nonce) || !wp_verify_nonce($nonce, $_POST['type'])) { $nonce = $_POST['update_oss_config-nonce'] ?? '';
if (empty($nonce) || !wp_verify_nonce($nonce, 'update_oss_config')) {
wp_die('Illegal requests!'); wp_die('Illegal requests!');
} }
}
$options = [];
if (!empty($_POST) && $_POST['type'] == 'aliyun_oss_set') {
$options['bucket'] = isset($_POST['bucket']) ? sanitize_text_field($_POST['bucket']) : ''; $options['bucket'] = isset($_POST['bucket']) ? sanitize_text_field($_POST['bucket']) : '';
$options['regional'] = isset($_POST['regional']) ? sanitize_text_field($_POST['regional']) : ''; $options['regional'] = isset($_POST['regional']) ? sanitize_text_field($_POST['regional']) : '';
$options['role_name'] = isset($_POST['role_name']) ? sanitize_text_field($_POST['role_name']) : ''; $options['role_name'] = isset($_POST['role_name']) ? sanitize_text_field($_POST['role_name']) : '';
@ -790,20 +740,19 @@ function oss_setting_page()
$options['is_internal'] = isset($_POST['is_internal']) ? 'true' : 'false'; $options['is_internal'] = isset($_POST['is_internal']) ? 'true' : 'false';
$options['nothumb'] = isset($_POST['nothumb']) ? 'true' : 'false'; $options['nothumb'] = isset($_POST['nothumb']) ? 'true' : 'false';
$options['nolocalsaving'] = isset($_POST['nolocalsaving']) ? 'true' : 'false'; $options['nolocalsaving'] = isset($_POST['nolocalsaving']) ? 'true' : 'false';
//仅用于插件卸载时比较使用
$options['upload_url_path'] = isset($_POST['upload_url_path']) ? sanitize_text_field(stripslashes($_POST['upload_url_path'])) : ''; $options['upload_url_path'] = isset($_POST['upload_url_path']) ? sanitize_text_field(stripslashes($_POST['upload_url_path'])) : '';
$options['style'] = isset($_POST['style']) ? sanitize_text_field($_POST['style']) : ''; $options['style'] = isset($_POST['style']) ? sanitize_text_field($_POST['style']) : '';
$options['update_file_name'] = isset($_POST['update_file_name']) ? sanitize_text_field($_POST['update_file_name']) : 'false'; $options['update_file_name'] = isset($_POST['update_file_name']) ? sanitize_text_field($_POST['update_file_name']) : 'false';
$options['origin_protect'] = isset($_POST['origin_protect']) ? sanitize_text_field($_POST['origin_protect']) : 'off'; $options['origin_protect'] = isset($_POST['origin_protect']) ? sanitize_text_field($_POST['origin_protect']) : 'off';
$options['origin_region'] = in_array($options['regional'], ['oss-accelerate', 'oss-accelerate-overseas']) ? '' : $options['regional'];
if ($options['regional'] === 'oss-rg-china-mainland' && $options['is_internal'] === 'true') { if ($options['regional'] === 'oss-rg-china-mainland' && $options['is_internal'] === 'true') {
echo '<div class="error"><p><strong>无地域属性不支持内网,请重新填写配置!</strong></p></div>'; echo '<div class="error"><p><strong>无地域属性不支持内网,请重新填写配置!</strong></p></div>';
$options = []; $options = [];
} }
} }
if (!empty($_POST) && $_POST['type'] == 'aliyun_oss_all') { if (!empty($_POST) and $_POST['type'] == 'aliyun_oss_all') {
$files = oss_read_dir_queue(get_home_path(), oss_get_option('upload_path')); $files = oss_read_dir_queue(get_home_path(), oss_get_option('upload_path'));
foreach ($files as $file) { foreach ($files as $file) {
oss_file_upload($file['key'], $file['filepath']); oss_file_upload($file['key'], $file['filepath']);
@ -812,11 +761,16 @@ function oss_setting_page()
} }
// 替换数据库链接 // 替换数据库链接
if(!empty($_POST) && $_POST['type'] == 'aliyun_oss_replace') { if(!empty($_POST) and $_POST['type'] == 'aliyun_oss_replace') {
$nonce = $_POST['update_oss_replace-nonce'] ?? '';
if (empty($nonce) || !wp_verify_nonce($nonce, 'update_oss_replace')) {
wp_die('Illegal requests!');
}
$old_url = esc_url_raw($_POST['old_url']); $old_url = esc_url_raw($_POST['old_url']);
$new_url = esc_url_raw($_POST['new_url']); $new_url = esc_url_raw($_POST['new_url']);
if (!empty($old_url)) { if (!empty($old_url) && !empty($new_url)) {
global $wpdb; global $wpdb;
$posts_name = $wpdb->prefix . 'posts'; $posts_name = $wpdb->prefix . 'posts';
// 文章内容 // 文章内容
@ -845,14 +799,18 @@ function oss_setting_page()
echo '<div class="updated"><p><strong>设置已保存!</strong></p></div>'; echo '<div class="updated"><p><strong>设置已保存!</strong></p></div>';
} }
$oss_options = get_option('oss_options', oss_get_default_options()); $oss_options = get_option('oss_options', true);
$oss_regional = esc_attr($oss_options['regional']); $oss_regional = esc_attr($oss_options['regional']);
$oss_is_internal = esc_attr($oss_options['is_internal']) == 'true'; $oss_is_internal = esc_attr($oss_options['is_internal']);
$oss_nothumb = esc_attr($oss_options['nothumb']) == 'true'; $oss_is_internal = $oss_is_internal == 'true';
$oss_nolocalsaving = esc_attr($oss_options['nolocalsaving']) == 'true';
$oss_nothumb = esc_attr($oss_options['nothumb']);
$oss_nothumb = $oss_nothumb == 'true';
$oss_nolocalsaving = esc_attr($oss_options['nolocalsaving']);
$oss_nolocalsaving = $oss_nolocalsaving == 'true';
$oss_update_file_name = esc_attr($oss_options['update_file_name']); $oss_update_file_name = esc_attr($oss_options['update_file_name']);
$oss_origin_protect = esc_attr($oss_options['origin_protect'] ?? 'off') !== 'off' ? 'checked="checked"' : ''; $oss_origin_protect = esc_attr($oss_options['origin_protect'] ?? 'off') !== 'off' ? 'checked="checked"' : '';
@ -869,7 +827,7 @@ function oss_setting_page()
<legend>Bucket名称</legend> <legend>Bucket名称</legend>
</th> </th>
<td> <td>
<input type="text" name="bucket" required value="<?php echo esc_attr($oss_options['bucket']); ?>" size="50" placeholder="请填写Bucket名称"/> <input type="text" name="bucket" value="<?php echo esc_attr($oss_options['bucket']); ?>" size="50" placeholder="请填写Bucket名称"/>
<p>请先访问 <a href="https://oss.console.aliyun.com/bucket" target="_blank">阿里云控制台</a> 创建<code>Bucket</code>,再填写以上内容。</p> <p>请先访问 <a href="https://oss.console.aliyun.com/bucket" target="_blank">阿里云控制台</a> 创建<code>Bucket</code>,再填写以上内容。</p>
</td> </td>
@ -898,14 +856,14 @@ function oss_setting_page()
<th> <th>
<legend>AccessKeyId</legend> <legend>AccessKeyId</legend>
</th> </th>
<td><input type="text" name="accessKeyId" required value="<?php echo esc_attr($oss_options['accessKeyId']); ?>" size="50" placeholder="AccessKeyId"/></td> <td><input type="text" name="accessKeyId" value="<?php echo esc_attr($oss_options['accessKeyId']); ?>" size="50" placeholder="AccessKeyId"/></td>
</tr> </tr>
<tr> <tr>
<th> <th>
<legend>AccessKeySecret</legend> <legend>AccessKeySecret</legend>
</th> </th>
<td> <td>
<input type="password" name="accessKeySecret" required value="<?php echo esc_attr($oss_options['accessKeySecret']); ?>" size="50" placeholder="AccessKeySecret"/> <input type="password" name="accessKeySecret" value="<?php echo esc_attr($oss_options['accessKeySecret']); ?>" size="50" placeholder="AccessKeySecret"/>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -952,7 +910,7 @@ function oss_setting_page()
<legend>本地文件夹</legend> <legend>本地文件夹</legend>
</th> </th>
<td> <td>
<input type="text" name="upload_path" required value="<?php echo oss_get_option('upload_path'); ?>" size="50" placeholder="请输入上传文件夹"/> <input type="text" name="upload_path" value="<?php echo oss_get_option('upload_path'); ?>" size="50" placeholder="请输入上传文件夹"/>
<p>附件在服务器上的存储位置,例如: <code>wp-content/uploads</code> (注意不要以“/”开头和结尾),根目录请输入<code>.</code></p> <p>附件在服务器上的存储位置,例如: <code>wp-content/uploads</code> (注意不要以“/”开头和结尾),根目录请输入<code>.</code></p>
</td> </td>
</tr> </tr>
@ -961,7 +919,7 @@ function oss_setting_page()
<legend>URL前缀</legend> <legend>URL前缀</legend>
</th> </th>
<td> <td>
<input type="text" name="upload_url_path" required value="<?php echo oss_get_option('upload_url_path'); ?>" size="50" placeholder="请输入URL前缀"/> <input type="text" name="upload_url_path" value="<?php echo oss_get_option('upload_url_path'); ?>" size="50" placeholder="请输入URL前缀"/>
<p><b>注意:</b></p> <p><b>注意:</b></p>
@ -1007,10 +965,10 @@ function oss_setting_page()
<tr> <tr>
<th><legend>保存/更新选项</legend></th> <th><legend>保存/更新选项</legend></th>
<td><input type="submit" class="button button-primary" value="保存更改"/></td> <td><input type="submit" class="button button-primary" value="保存更改"/></td>
<?php wp_nonce_field('update_oss_config', 'update_oss_config-nonce'); ?>
</tr> </tr>
</table> </table>
<input type="hidden" name="type" value="aliyun_oss_set"> <input type="hidden" name="type" value="oss_set">
<?php wp_nonce_field('aliyun_oss_set', 'aliyun_oss_set-nonce'); ?>
</form> </form>
<form method="post"> <form method="post">
<table class="form-table"> <table class="form-table">
@ -1019,10 +977,9 @@ function oss_setting_page()
<legend>同步历史附件</legend> <legend>同步历史附件</legend>
</th> </th>
<input type="hidden" name="type" value="aliyun_oss_all"> <input type="hidden" name="type" value="aliyun_oss_all">
<?php wp_nonce_field('aliyun_oss_all', 'aliyun_oss_all-nonce'); ?>
<td> <td>
<input type="submit" class="button button-secondary" value="开始同步"/> <input type="submit" class="button button-secondary" value="开始同步"/>
<p><b>注意:如果是首次同步,执行时间将会非常长(根据你的历史附件数量),有可能会因执行时间过长,导致页面显示超时或者报错。<br> 所以,建议附件数量过多的用户,考虑官方的<a target="_blank" rel="nofollow" href="https://help.aliyun.com/knowledge_detail/39628.html">同步工具</a>或下载 WP-CLI 使用插件内置的命令进行上传。</b></p> <p><b>注意:如果是首次同步,执行时间将会十分十分长(根据你的历史附件数量),有可能会因执行时间过长,页面显示超时或者报错。<br> 所以,建议那些几千上万附件的大神们,考虑官方的 <a target="_blank" rel="nofollow" href="https://help.aliyun.com/knowledge_detail/39628.html">同步工具</a></b></p>
</td> </td>
</tr> </tr>
</table> </table>
@ -1035,7 +992,7 @@ function oss_setting_page()
<legend>数据库原链接替换</legend> <legend>数据库原链接替换</legend>
</th> </th>
<td> <td>
<input type="text" name="old_url" required size="50" placeholder="请输入要替换的旧域名"/> <input type="text" name="old_url" size="50" placeholder="请输入要替换的旧域名"/>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -1051,7 +1008,7 @@ function oss_setting_page()
<legend></legend> <legend></legend>
</th> </th>
<input type="hidden" name="type" value="aliyun_oss_replace"> <input type="hidden" name="type" value="aliyun_oss_replace">
<?php wp_nonce_field('aliyun_oss_replace', 'aliyun_oss_replace-nonce'); ?> <?php wp_nonce_field('update_oss_replace', 'update_oss_replace-nonce'); ?>
<td> <td>
<input type="submit" class="button button-secondary" value="开始替换"/> <input type="submit" class="button button-secondary" value="开始替换"/>
<p><b>注意:如果是首次替换,请注意备份!此功能会替换文章以及设置的特色图片(题图)等使用的资源链接</b></p> <p><b>注意:如果是首次替换,请注意备份!此功能会替换文章以及设置的特色图片(题图)等使用的资源链接</b></p>

View File

@ -6,6 +6,7 @@ if (!class_exists('WP_CLI')) {
class OSS_CLI_Commands class OSS_CLI_Commands
{ {
/** /**
* 同步文件夹到 OSS * 同步文件夹到 OSS
* *
@ -95,29 +96,6 @@ class OSS_CLI_Commands
WP_CLI::error("Failed: {$path}"); WP_CLI::error("Failed: {$path}");
} }
} }
/**
* 删除 OSS 中的文件
*
* ## OPTIONS
*
* <key>
* : 需要删除 OSS 中的文件 key
*
* ## EXAMPLES
*
* wp oss delete-file 2021/01/1.jpg
*
* @when after_wp_load
* @subcommand delete-file
*/
public function delete_file($args, $assoc_args)
{
[$key] = $args;
WP_CLI::line("Deleting file [{$key}] from OSS...");
oss_delete_oss_file($key);
}
} }
WP_CLI::add_command('oss', 'OSS_CLI_Commands', ['shortdesc' => 'Commands used to operate OSS.']); WP_CLI::add_command('oss', 'OSS_CLI_Commands', ['shortdesc' => 'Commands used to operate OSS.']);

View File

@ -3,17 +3,17 @@ Contributors: shenyanzhi
Donate link: https://qq52o.me/sponsor.html Donate link: https://qq52o.me/sponsor.html
Tags: oss, 阿里云, 对象存储, aliyun Tags: oss, 阿里云, 对象存储, aliyun
Requires at least: 4.6 Requires at least: 4.6
Tested up to: 6.8 Tested up to: 6.5
Requires PHP: 7.1 Requires PHP: 7.1
Stable tag: 1.5.1 Stable tag: 1.4.13
License: Apache2.0 License: Apache2.0
License URI: http://www.apache.org/licenses/LICENSE-2.0.html License URI: http://www.apache.org/licenses/LICENSE-2.0.html
使用阿里云对象存储 OSS 作为附件存储空间。(This is a plugin that uses Aliyun Object Storage Service for attachments remote saving.) 使用阿里云对象存储 OSS 作为附件存储空间。This is a plugin that uses Aliyun Object Storage Service for attachments remote saving.
== Description == == Description ==
使用阿里云对象存储 OSS 作为附件存储空间。(This is a plugin that uses Aliyun Object Storage Service for attachments remote saving.) 使用阿里云对象存储 OSS 作为附件存储空间。This is a plugin that uses Aliyun Object Storage Service for attachments remote saving.
- 依赖阿里云 OSS 服务https://www.aliyun.com/product/oss - 依赖阿里云 OSS 服务https://www.aliyun.com/product/oss
@ -27,12 +27,10 @@ License URI: http://www.apache.org/licenses/LICENSE-2.0.html
6. 支持同步历史附件到阿里云对象存储 OSS 6. 支持同步历史附件到阿里云对象存储 OSS
7. 支持阿里云 OSS 图片处理 7. 支持阿里云 OSS 图片处理
8. 支持上传文件自动重命名 8. 支持上传文件自动重命名
9. 支持使用 ECS 的 RAM 操作 9. 支持使用 RAM 操作
10. 支持原图保护 10. 支持原图保护
11. 支持 `wp-cli` 命令上传/删除文件 11. 支持 `wp-cli` 命令上传文件
12. 支持多站点 12. 插件更多详细介绍和安装:[https://github.com/sy-records/aliyun-oss-wordpress](https://github.com/sy-records/aliyun-oss-wordpress)
13. 支持图片裁剪编辑等操作后的上传
14. 插件更多详细介绍和安装:[https://github.com/sy-records/aliyun-oss-wordpress](https://github.com/sy-records/aliyun-oss-wordpress)
## 其他插件 ## 其他插件
@ -78,50 +76,6 @@ License URI: http://www.apache.org/licenses/LICENSE-2.0.html
== Changelog == == Changelog ==
= 1.5.1 =
- Update nonce handling for form submissions
= 1.5.0 =
- Enhance region handling for OSS configuration
= 1.4.21 =
- Optimize uninstall code
= 1.4.20 =
- Fix origin_protect default value error
= 1.4.19 =
- Fix sub-site failure to delete remote images
- Fix `get_option` default value error
- Fix missing delete backup images
= 1.4.18 =
- Images processing ignore gif format
= 1.4.17 =
- Fix endpoint failed to use https
= 1.4.16 =
- 强制 endpoint 使用 https
= 1.4.15 =
- 将阿里云V1签名升级为V4签名
= 1.4.14 =
- 支持 `wp-cli` 命令删除文件
- Use wp_get_mime_types instead of get_allowed_mime_types
- 修复 heic 格式图片上传失败问题
= 1.4.13 = = 1.4.13 =
- 支持 `wp-cli` 命令上传文件 - 支持 `wp-cli` 命令上传文件

View File

@ -4,5 +4,12 @@ if (!defined('WP_UNINSTALL_PLUGIN')) {
exit; exit;
} }
update_option('upload_url_path', ''); $options = get_option('oss_options', true);
$upload_url_path = get_option('upload_url_path');
$oss_upload_url_path = esc_attr($options['upload_url_path']);
if ($upload_url_path == $oss_upload_url_path) {
update_option('upload_url_path', '');
}
delete_option('oss_options'); delete_option('oss_options');