From bd7586a3b7f697624a8d0e21b39db37d9f3cd6ee Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 24 Sep 2026 11:19:47 +0800 Subject: [PATCH] =?UTF-8?q?refactor(attachment):=20=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E4=B8=8E=E8=83=8C=E6=99=AF=E5=9B=BE=E4=B8=8A=E9=99=90=E5=B9=B6?= =?UTF-8?q?=E5=85=A5=E5=89=8D=E7=AB=AF=E5=9B=BE=E7=89=87=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除独立的「用户头像与资料卡图片」分组与 avatar_max_size 字段, 与参考主题保持一致:头像/资料卡背景图与投稿评论图片共用 upload_img_size 同一套用户类型 × 大小配置 - 5 处消费方(REST 头像/背景上传、后台头像字段、用户中心头像与 封面配置)全部改读 UploadLimits::limit_bytes('image'),提示语 改用 size_format 与实际上限对齐 - 附件配置仅剩上传大小/上传格式/上传行为三组;管理端 SPA 已重建, 421 项契约测试通过 --- .../src/schema/sections/permissions/index.js | 13 ++---------- inc/helpers/aksrt-avatar.php | 20 +++++++++---------- inc/helpers/aksrt-user-center.php | 12 +++++------ src/Admin/Schema/SchemaPermissions.php | 5 +---- .../UserControllerProfileMediaOperations.php | 9 +++++---- 5 files changed, 24 insertions(+), 35 deletions(-) diff --git a/assets/admin/src/schema/sections/permissions/index.js b/assets/admin/src/schema/sections/permissions/index.js index 811ebe91..af0893b0 100644 --- a/assets/admin/src/schema/sections/permissions/index.js +++ b/assets/admin/src/schema/sections/permissions/index.js @@ -218,9 +218,8 @@ export const permissionsSchemas = { key: 'permissions.attachment', title: '附件配置', icon: 'fa fas fa-paperclip', - description: '统一管理头像、上传大小、上传格式与上传行为;准入权限请在“基本权限”中配置。', + description: '统一管理上传大小、上传格式与上传行为;准入权限请在“基本权限”中配置。', defaults: { - avatar_max_size: 2, upload_img_size: [ { type: 'default', val: 5 }, { type: 'admin', val: 20 }, @@ -243,14 +242,6 @@ export const permissionsSchemas = { close_attachment_page: true, }, groups: [ - { - key: 'profile', - title: '用户头像与资料卡图片', - icon: 'fa fas fa-id-card', - fields: [ - { key: 'avatar_max_size', label: '头像/用户资料卡背景图大小上限 (MB)', type: 'number', min: 1, max: 10 }, - ], - }, { key: 'size-limits', title: '上传大小限制', @@ -263,7 +254,7 @@ export const permissionsSchemas = { type: 'repeater', min: 1, addText: '添加细分用户权限', - help: '投稿、评论等前端场景允许上传的最大图片大小(单位 MB)。同一个用户满足多个条件则取最大值,「最小默认值」为所有人兜底。', + help: '投稿、评论、头像与资料卡背景图等前端场景允许上传的最大图片大小(单位 MB)。同一个用户满足多个条件则取最大值,「最小默认值」为所有人兜底。', fields: uploadSizeFields.map((field) => ({ ...field, default: field.key === 'val' ? 5 : field.default })), }, { key: 'image_upload_multiple', label: '图片批量上传最大数量', type: 'number', min: 0, max: 100, unit: '张', help: '前端投稿、评论上传图片允许的单次批量上传数量(为 0 则不限制,为 1 则不能批量上传)。' }, diff --git a/inc/helpers/aksrt-avatar.php b/inc/helpers/aksrt-avatar.php index 5e41e677..17b317c7 100644 --- a/inc/helpers/aksrt-avatar.php +++ b/inc/helpers/aksrt-avatar.php @@ -345,14 +345,14 @@ add_filter('user_profile_update_errors', static function (WP_Error $errors, bool return; } - $file = $_FILES['aksrt_avatar_file']; - $settings = class_exists('\\AKSRT\\Settings\\Settings') ? \AKSRT\Settings\Settings::get_all() : []; - $max_size_mb = max(1, min(10, (int) ($settings['avatar_max_size'] ?? 2))); - $actual_size = !empty($file['tmp_name']) && is_readable($file['tmp_name']) ? (int) filesize($file['tmp_name']) : 0; - if ((int) ($file['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK || $actual_size <= 0 || $actual_size > $max_size_mb * MB_IN_BYTES) { - $errors->add('aksrt_avatar_size', sprintf(__('头像文件无效或超过 %dMB', 'aksrt'), $max_size_mb)); - return; - } +$file = $_FILES['aksrt_avatar_file']; +// 头像上限并入「前端图片上传限制」统一治理(参考主题同源)。 +$max_size = class_exists('\AKSRT\Attachment\UploadLimits') ? \AKSRT\Attachment\UploadLimits::limit_bytes('image') : (int) wp_max_upload_size(); +$actual_size = !empty($file['tmp_name']) && is_readable($file['tmp_name']) ? (int) filesize($file['tmp_name']) : 0; +if ((int) ($file['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK || $actual_size <= 0 || $actual_size > $max_size) { + $errors->add('aksrt_avatar_size', sprintf(__('头像文件无效或超过 %s', 'aksrt'), size_format($max_size))); + return; +} require_once ABSPATH . 'wp-admin/includes/file.php'; $checked = wp_check_filetype_and_ext($file['tmp_name'], $file['name'], [ @@ -395,8 +395,8 @@ if (!function_exists('aksrt_save_admin_avatar_field')) { return; } - $settings = class_exists('\\AKSRT\\Settings\\Settings') ? \AKSRT\Settings\Settings::get_all() : []; - $max_size = max(1, min(10, (int) ($settings['avatar_max_size'] ?? 2))) * MB_IN_BYTES; + // 头像上限并入「前端图片上传限制」统一治理(参考主题同源)。 + $max_size = class_exists('\AKSRT\Attachment\UploadLimits') ? \AKSRT\Attachment\UploadLimits::limit_bytes('image') : (int) wp_max_upload_size(); $file = $_FILES['aksrt_avatar_file']; $actual_size = !empty($file['tmp_name']) && is_readable($file['tmp_name']) ? (int) filesize($file['tmp_name']) : 0; if ((int) ($file['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK || $actual_size <= 0 || $actual_size > $max_size) { diff --git a/inc/helpers/aksrt-user-center.php b/inc/helpers/aksrt-user-center.php index a25480e6..529dba05 100644 --- a/inc/helpers/aksrt-user-center.php +++ b/inc/helpers/aksrt-user-center.php @@ -383,8 +383,8 @@ if (!function_exists('aksrt_user_center_avatar_upload_config')) { if (!$enabled) { return []; } - $settings = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_all() : []; - $max_size = max(1, min(10, (int) ($settings['avatar_max_size'] ?? 2))) * MB_IN_BYTES; + // 头像上限并入「前端图片上传限制」统一治理(参考主题同源)。 + $max_size = class_exists('\AKSRT\Attachment\UploadLimits') ? \AKSRT\Attachment\UploadLimits::limit_bytes('image') : (int) wp_max_upload_size(); return [ 'enabled' => true, 'restUrl' => rest_url('aksrt/v1/user/avatar'), @@ -396,7 +396,7 @@ if (!function_exists('aksrt_user_center_avatar_upload_config')) { 'maxSize' => $max_size, 'idleText' => __('更换头像', 'aksrt'), 'loadingText' => __('上传中…', 'aksrt'), - 'tooLargeText' => sprintf(__('图片大小不能超过 %dMB', 'aksrt'), (int) ($max_size / MB_IN_BYTES)), + 'tooLargeText' => sprintf(__('图片大小不能超过 %s', 'aksrt'), size_format($max_size)), 'successText' => __('头像已更新', 'aksrt'), 'errorText' => __('头像上传失败', 'aksrt'), ]; @@ -411,8 +411,8 @@ if (!function_exists('aksrt_user_center_cover_upload_config')) { if (!$allow_bg_upload) { return []; } - $settings = class_exists('\\AKSRT\\Settings\\Settings') ? \AKSRT\Settings\Settings::get_all() : []; - $max_size = max(1, min(10, (int) ($settings['avatar_max_size'] ?? 2))) * MB_IN_BYTES; + // 背景图上限并入「前端图片上传限制」统一治理(参考主题同源)。 + $max_size = class_exists('\AKSRT\Attachment\UploadLimits') ? \AKSRT\Attachment\UploadLimits::limit_bytes('image') : (int) wp_max_upload_size(); return [ 'enabled' => true, 'restUrl' => rest_url('aksrt/v1/user/background'), @@ -425,7 +425,7 @@ if (!function_exists('aksrt_user_center_cover_upload_config')) { 'fallbackImage' => function_exists('aksrt_get_user_cover_url') ? aksrt_get_user_cover_url(get_current_user_id()) : get_theme_file_uri('assets/img/user_t.jpg'), 'idleText' => __('修改背景图', 'aksrt'), 'loadingText' => __('上传中…', 'aksrt'), - 'tooLargeText' => sprintf(__('图片大小不能超过 %dMB', 'aksrt'), (int) ($max_size / MB_IN_BYTES)), + 'tooLargeText' => sprintf(__('图片大小不能超过 %s', 'aksrt'), size_format($max_size)), 'successText' => __('背景图已更新', 'aksrt'), 'errorText' => __('上传失败', 'aksrt'), 'networkErrorText' => __('网络错误,请重试', 'aksrt'), diff --git a/src/Admin/Schema/SchemaPermissions.php b/src/Admin/Schema/SchemaPermissions.php index ee7ab9ee..e66cccff 100644 --- a/src/Admin/Schema/SchemaPermissions.php +++ b/src/Admin/Schema/SchemaPermissions.php @@ -91,15 +91,12 @@ class SchemaPermissions { 'version' => '1.2.0', 'option_key' => 'aksrt_settings', 'groups' => [ - ['key' => 'profile', 'title' => '用户头像与资料卡图片', 'fields' => [ - ['key' => 'avatar_max_size', 'label' => '头像/用户资料卡背景图大小上限 (MB)', 'type' => 'number', 'default' => 2, 'min' => 1, 'max' => 10], - ]], ['key' => 'size-limits', 'title' => '上传大小限制', 'fields' => [ ['key' => 'size_limit_notice', 'label' => '服务器环境提示', 'type' => 'notice', 'alertType' => 'warning', 'alertContent' => '设置上传大小,请考虑服务器负荷、硬盘,以及服务器最大能支持的范围。实际上传大小取「主题限制」与「PHP 环境限制」的较小值,超过 PHP 环境限制时请调整 php.ini 的 upload_max_filesize 与 post_max_size。'], ['key' => 'upload_img_size', 'label' => '前端图片上传限制', 'type' => 'repeater', 'default' => [ ['type' => 'default', 'val' => 5], ['type' => 'admin', 'val' => 20], - ], 'min' => 1, 'button_title' => '添加细分用户权限', 'help' => '投稿、评论等前端场景允许上传的最大图片大小(单位 MB)。同一个用户满足多个条件则取最大值,「最小默认值」为所有人兜底。', 'fields' => [ + ], 'min' => 1, 'button_title' => '添加细分用户权限', 'help' => '投稿、评论、头像与资料卡背景图等前端场景允许上传的最大图片大小(单位 MB)。同一个用户满足多个条件则取最大值,「最小默认值」为所有人兜底。', 'fields' => [ ['key' => 'type', 'label' => '用户类型', 'type' => 'select', 'default' => 'logged', 'options' => self::upload_user_type_options()], ['key' => 'val', 'label' => '可上传大小', 'type' => 'number', 'default' => 5, 'min' => 1, 'max' => 2048, 'unit' => 'M'], ]], diff --git a/src/Admin/UserControllerProfileMediaOperations.php b/src/Admin/UserControllerProfileMediaOperations.php index 9be9c4d2..b496ff30 100644 --- a/src/Admin/UserControllerProfileMediaOperations.php +++ b/src/Admin/UserControllerProfileMediaOperations.php @@ -84,12 +84,13 @@ trait UserControllerProfileMediaOperations { return $this->error(__('头像文件上传失败,请重新选择', 'aksrt'), 400); } - $settings = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_all() : []; - $max_size_mb = max(1, min(10, (int) ($settings['avatar_max_size'] ?? 2))); - $max_size = $max_size_mb * MB_IN_BYTES; + // 头像与资料卡背景图并入「前端图片上传限制」统一治理(参考主题同源)。 + $max_size = class_exists('\AKSRT\Attachment\UploadLimits') + ? \AKSRT\Attachment\UploadLimits::limit_bytes('image', $user_id) + : (int) wp_max_upload_size(); $actual_size = !empty($file['tmp_name']) && is_readable($file['tmp_name']) ? (int) filesize($file['tmp_name']) : 0; if ($actual_size <= 0 || $actual_size > $max_size) { - return $this->error(sprintf(__('图片大小必须在 1 字节至 %dMB 之间', 'aksrt'), $max_size_mb), 413); + return $this->error(sprintf(__('图片大小不能超过 %s。', 'aksrt'), size_format($max_size)), 413); } $checked = wp_check_filetype_and_ext($file['tmp_name'], $file['name'], [