商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > WordPress 图片上传尺寸限制:如何为特定页面排除验证规则

WordPress 图片上传尺寸限制:如何为特定页面排除验证规则

  发布于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');

⚠️ 注意事项与最佳实践:

  • 别嵌套函数定义:有些答案会把整个函数包裹在 if 里,这其实是错误写法——PHP 不允许条件式函数声明。正确的做法是在钩子回调内部做逻辑分支。
  • 优先用语义化判断wcmp_is_store_page() 是 WCMP 提供的可靠函数,比靠 URL 或页面 ID 判断健壮得多。如果这个函数不存在,可以用 is_admin() 辅助判断后台/前台环境。
  • 错误提示本地化:示例里用了中文提示。如果需要多语言支持,建议换成 __() 函数包裹字符串。
  • 性能考量getimagesize() 只读取文件头,开销很小,但最好避免在非图片文件上重复调用(代码里已经通过 $image_info 检查做了规避)。
  • 测试覆盖要全面:务必在供应商账户下,分别测试“商品图上传”、“店铺 Logo 上传”、“Banner 上传”以及“后台媒体库上传”,确保规则在预期场景下生效或跳过。

通过这套结构化的实现,既能保证平台内容质量,又能给供应商在必要场景下留出操作空间,真正做到“有约束的自由”。

本文转载于:https://www.php.cn/faq/2345719.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注