You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress仅编辑商品页生效的图片尺寸限制代码失效排查

问题原因

原有实现存在三个核心问题,导致规则全局生效、错误提示无法正常展示:

  • 分支返回值缺失:所有校验逻辑均包裹在条件判断块内,不满足判断条件时函数未返回$file对象,WordPress会默认判定上传失败,直接拦截所有非匹配场景的上传请求。
  • 页面判断逻辑失效:WCMp商品编辑页的图片上传走异步接口,请求地址为async-upload.php或admin-ajax.php,路径本身不包含edit-product字段,仅靠$_SERVER['REQUEST_URI']无法匹配前端编辑商品页的上传场景,范围判断规则完全失效。
  • 兼容逻辑缺失:未处理非图片文件、图片信息读取失败的边界场景,且代码中&&为HTML转义后的与运算符,直接复制使用会触发PHP语法错误,导致上传流程中断,错误提示无法透传到前端。
修复代码

将以下代码替换原有代码,放入主题functions.php或自定义功能插件中即可:

add_filter('wp_handle_upload_prefilter', 'wcmp_vendor_product_image_size_limit');
function wcmp_vendor_product_image_size_limit($file) {
    // 非WCMp供应商直接放行
    if (!function_exists('is_user_wcmp_vendor') || !is_user_wcmp_vendor(get_current_user_id())) {
        return $file;
    }

    // 匹配编辑商品页场景:兼容直接访问页面、异步上传两种情况
    $is_edit_product_page = false;
    // 校验当前是否直接访问WCMp编辑商品页
    if (function_exists('wcmp_is_page') && wcmp_is_page('edit-product')) {
        $is_edit_product_page = true;
    }
    // 校验异步上传的来源页是否为WCMp编辑商品页,排除后台上传请求
    $referer = wp_get_raw_referer();
    if ($referer && strpos($referer, 'edit-product') !== false && strpos($referer, 'wp-admin') === false) {
        $is_edit_product_page = true;
    }
    // 非目标页面直接放行
    if (!$is_edit_product_page) {
        return $file;
    }

    // 仅对图片类型文件做尺寸校验
    $file_type = wp_check_filetype($file['name']);
    $allowed_image_ext = array('jpg', 'jpeg', 'png', 'webp', 'gif');
    if (!in_array(strtolower($file_type['ext']), $allowed_image_ext)) {
        return $file;
    }

    // 读取图片尺寸,读取失败直接返回错误
    $image_info = @getimagesize($file['tmp_name']);
    if (!$image_info) {
        $file['error'] = '无法识别图片尺寸,请更换有效图片文件后重试';
        return $file;
    }

    // 尺寸阈值配置,可根据需求修改
    $min_size = array(
        'width' => 1080,
        'height' => 1080
    );
    $max_size = array(
        'width' => 12000,
        'height' => 12000
    );

    list($img_width, $img_height) = $image_info;
    // 校验尺寸规则
    if ($img_width < $min_size['width'] || $img_height < $min_size['height']) {
        $file['error'] = sprintf('图片尺寸不符合要求,最小宽高需为 %d×%d 像素', $min_size['width'], $min_size['height']);
    } elseif ($img_width > $max_size['width'] || $img_height > $max_size['height']) {
        $file['error'] = sprintf('图片尺寸不符合要求,最大宽高不得超过 %d×%d 像素', $max_size['width'], $max_size['height']);
    }

    return $file;
}
说明
  • 规则仅对WCMp供应商在前端商品编辑页的上传行为生效,不会影响管理员后台上传、供应商在其他页面(如头像上传、店铺封面上传)的上传操作。
  • 可直接修改代码中$min_size、$max_size数组的数值调整尺寸限制,错误提示会直接在WordPress原生上传组件中展示,无需额外开发前端逻辑。
  • 若需要支持其他图片格式,直接在$allowed_image_ext数组中添加对应后缀即可。

内容的提问来源于stack exchange,提问作者timkerrem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:27:23