
本文介绍如何仅在 woocommerce 多供应商插件(wcmp)的“编辑商品”页面对供应商上传的图片实施宽高限制,避免误触发全局校验,并修复逻辑错误与返回机制问题。
本文介绍如何仅在 woocommerce 多供应商插件(wcmp)的“编辑商品”页面对供应商上传的图片实施宽高限制,避免误触发全局校验,并修复逻辑错误与返回机制问题。
在多供应商电商平台中,常需对不同角色、不同页面的文件上传行为施加差异化约束。例如:仅允许供应商在「编辑商品」页面上传符合特定分辨率要求的图片(如最小 1080×1080,最大 12000×12000),而其他页面(如个人资料页、店铺首页)则保持默认上传策略。若直接依赖模板名或页面 ID 判断,容易因 WCMp 动态路由(如 /dashboard/edit-product/123/)导致匹配失效。
核心解决方案是通过 $_SERVER['REQUEST_URI'] 进行路径关键词匹配,并结合用户角色校验,确保规则精准生效。但原始代码存在三处关键问题:
- 逻辑错误:判断“过小”时误用 <= 和 >= 混合比较(应统一为 < 和 <);
- 缺失默认返回:未在所有分支后显式 return $file,导致非目标页面上传被意外拦截;
- 错误提示覆盖不全:未处理 $file['error'] 已存在的情况,可能掩盖其他上传错误。
以下是修正后的完整函数(已适配 WCMp 环境):
安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。
function resize_image_resolution( $file ) {
// 仅对 WCMp 供应商且当前请求 URL 包含 'edit-product' 时启用校验
if (
is_user_wcmp_vendor( get_current_user_id() ) &&
isset( $_SERVER['REQUEST_URI'] ) &&
false !== strpos( $_SERVER['REQUEST_URI'], 'edit-product' )
) {
// 跳过非图像文件(如 .pdf、.txt)
$mime_type = $file['type'] ?? '';
if ( ! in_array( $mime_type, [ 'image/jpeg', 'image/png', 'image/gif', 'image/webp' ], true ) ) {
return $file;
}
// 获取图像尺寸(注意:getimagesize 可能失败,需容错)
$image = @getimagesize( $file['tmp_name'] );
if ( false === $image ) {
$file['error'] = '无法读取图片尺寸,请上传有效的 JPEG、PNG、GIF 或 WebP 格式图片。';
return $file;
}
$minimum = [
'width' => 1080,
'height' => 1080,
];
$maximum = [
'width' => 12000,
'height' => 12000,
];
$image_width = $image[0];
$image_height = $image[1];
// 精确判断:宽或高任一维度小于最小值 → 太小
if ( $image_width < $minimum['width'] || $image_height < $minimum['height'] ) {
$file['error'] = '图片尺寸过小:最小要求为 ' . $minimum['width'] . '×' . $minimum['height'] . ' 像素。';
}
// 宽或高任一维度超过最大值 → 太大
elseif ( $image_width > $maximum['width'] || $image_height > $maximum['height'] ) {
$file['error'] = '图片尺寸过大:最大允许 ' . $maximum['width'] . '×' . $maximum['height'] . ' 像素。';
}
// 其他情况(含非目标页面)均放行
}
return $file; // ✅ 关键:始终返回 $file,确保非目标场景不中断上传流程
}
add_filter( 'wp_handle_upload_prefilter', 'resize_image_resolution' );注意事项与增强建议:
- ✅ 路径匹配健壮性:strpos() 对 /edit-product/ 的匹配足够可靠,无需正则;若需更高精度(如排除 /edit-product-category/),可改用 preg_match( '/\/edit-product(?:\/|$)/', $_SERVER['REQUEST_URI'] )。
- ✅ 性能优化:getimagesize() 在服务器端解析图片头信息,开销较小;但大量并发上传时建议搭配缓存或前端预检(如 JS Canvas 尺寸校验)。
- ⚠️ 错误处理:使用 @getimagesize() 抑制警告,并主动检查返回值,防止因损坏图片导致 PHP 致命错误。
- ? 安全补充:该过滤器仅校验尺寸,不替代 MIME 类型验证或病毒扫描,生产环境务必配合 upload_mimes 过滤器限制文件类型,并启用服务器级防恶意文件措施。
最终效果:供应商在「编辑商品」页上传图片时,将实时收到清晰的尺寸错误提示;而在其他任何页面(包括前台商品发布、后台媒体库等)上传均不受影响,实现真正的上下文感知式限制。

















