发布于2026-07-18 阅读(0)
扫一扫,手机访问
本文详细介绍如何在 WordPress 中为供应商用户设置图片上传尺寸限制,并灵活排除特定页面(如店铺首页、Logo 上传页),避免误拦合规图片。通过条件判断结合 `wp_handle_upload_prefilter` 钩子,实现精准控制。
你在用 WCMP(WooCommerce Multi-Vendor Marketplace)之类的多供应商插件时,是不是也遇到过这样的问题:一方面想限制供应商上传的图片尺寸,比如要求主图至少 1080×1080,另一方面又怕超大图(比如超过 12000×12000)拖慢网站性能,但要是直接全局启用限制,又会把“店铺 Logo”或“横幅 Banner”这种本就应该小尺寸的图片给误伤。
所以,关键就在于动态判断当前上传上下文——换句话说,你得知道用户是在哪个页面、哪个场景下上传图片的。只在非白名单页面(比如商品编辑页、店铺设置页)生效校验,而在像 wcmp_before_shop_front 触发的店铺首页、或者特定页面(比如 ID=24 的 Logo 上传页)中,直接跳过验证。
下面是一套经过优化的完整解决方案,建议直接写入主题的 functions.php 或做成一个专用插件:
function wcmp_vendor_image_resolution_check($file) {
// 1. 仅对 WCMP 供应商用户执行检查
if (!is_user_wcmp_vendor(get_current_user_id())) {
return $file;
}
// 2. 【核心】排除特定页面:根据实际需求任选其一(取消注释并配置)
// ✅ 方案 A:排除指定页面 ID(如 Logo/Banner 上传页 ID = 24)
// if (is_page(24)) {
// return $file;
// }
// ✅ 方案 B:排除特定页面模板(如 custom-banner-upload.php)
// if (is_page_template('custom-banner-upload.php')) {
// return $file;
// }
// ✅ 方案 C:排除 WCMP 店铺首页(推荐 —— 基于问题中提供的钩子语义)
// 注意:wp_handle_upload_prefilter 在前端上传时触发,此时无法直接用 do_action,
// 但我们可通过检测当前请求是否处于店铺前台来间接判断
if (function_exists('wcmp_is_store_page') && wcmp_is_store_page()) {
return $file;
}
// ✅ 方案 D:更通用的 URL 路径判断(适用于无函数支持的环境)
// $current_url = esc_url_raw($_SERVER['REQUEST_URI']);
// if (strpos($current_url, '/vendor-dashboard/') !== false ||
// strpos($current_url, '/store/') !== false) {
// return $file;
// }
// 3. 执行尺寸校验
$image_info = getimagesize($file['tmp_name']);
if (!$image_info) {
return $file; // 非图片文件,跳过校验
}
$width = $image_info[0];
$height = $image_info[1];
$min = ['width' => 1080, 'height' => 1080];
$max = ['width' => 12000, 'height' => 12000];
$too_small = '图片尺寸过小,请上传宽度和高度均不小于 1080 像素的图片。';
$too_large = '图片尺寸过大,请上传宽度和高度均不超过 12000 像素的图片。';
if ($width < $min['width'] || $height < $min['height']) {
$file['error'] = $too_small;
return $file;
}
if ($width > $max['width'] || $height > $max['height']) {
$file['error'] = $too_large;
return $file;
}
return $file;
}
add_filter('wp_handle_upload_prefilter', 'wcmp_vendor_image_resolution_check');
wcmp_is_store_page() 是 WCMP 提供的可靠函数,比靠 URL 或页面 ID 判断健壮得多。如果这个函数不存在,可以用 is_admin() 辅助判断后台/前台环境。__() 函数包裹字符串。getimagesize() 只读取文件头,开销很小,但最好避免在非图片文件上重复调用(代码里已经通过 $image_info 检查做了规避)。通过这套结构化的实现,既能保证平台内容质量,又能给供应商在必要场景下留出操作空间,真正做到“有约束的自由”。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8