WordPress自定义头像上传器仅生成指定图片尺寸的代码问题排查
问题分析与修复方案
你的代码犯了两个关键错误
- 逻辑完全搞反了:你要的是保留
avatar_scale_32x32和avatar_scale_96x96,但代码里却在检测到头像上传时删掉这俩尺寸,反而留着其他所有尺寸,这直接和需求背道而驰。 - 直接用
$_FILES不靠谱:intermediate_image_sizes过滤器触发时,WordPress可能已经处理完文件上传,$_FILES不一定还能准确反映当前上传的来源,导致判断失效。
修正后的代码实现
第一步:先标记头像上传请求
在文件上传的早期阶段,先判断是不是头像上传器的请求,给当前请求打个标记:
function mark_avatar_upload( $file ) { // 识别头像上传器的请求(适配WP User Avatar的默认action) if ( isset( $_POST['action'] ) && $_POST['action'] === 'wpua_upload' || isset( $_FILES['wpua-file'] ) ) { add_filter( 'intermediate_image_sizes', 'filter_avatar_image_sizes' ); } return $file; } add_filter( 'wp_handle_upload_prefilter', 'mark_avatar_upload' );
第二步:过滤头像上传的生成尺寸
只保留你需要的两个尺寸,删掉其他所有尺寸:
function filter_avatar_image_sizes( $sizes ) { $allowed_sizes = ['avatar_scale_32x32', 'avatar_scale_96x96']; foreach ( $sizes as $index => $size ) { // 只保留允许的尺寸,其他全部删除 if ( !in_array( $size, $allowed_sizes ) ) { unset( $sizes[$index] ); } } return $sizes; }
这样改的原因
- 用
wp_handle_upload_prefilter钩子在上传早期检测请求,能准确识别头像上传场景,避免上下文丢失的问题。 - 逻辑彻底反转:从删除目标尺寸变成保留目标尺寸、删除其他尺寸,完全匹配你的需求——头像上传仅生成指定缩略图+原图。
内容的提问来源于stack exchange,提问作者Aras Riyahi
相关产品推荐
相关产品推荐

