如何让WordPress仅在特定表单上传时不生成额外图片尺寸?
解决WordPress表单上传图片时禁止生成缩略图副本的方法
方法一:临时禁用中间尺寸生成钩子
在执行图片上传的代码块前后,临时移除WordPress生成中间尺寸的相关钩子,上传完成后再恢复,不会影响其他上传场景。
示例代码:
// 上传前保存原有钩子并移除 $original_intermediate_sizes = apply_filters('intermediate_image_sizes', get_intermediate_image_sizes()); remove_filter('intermediate_image_sizes', 'wp_intermediate_image_sizes'); // 禁用默认缩略图生成 add_filter('intermediate_image_sizes', '__return_empty_array'); // 执行你的图片上传代码(如wp_handle_upload) $upload_result = wp_handle_upload($file, $upload_overrides); // 上传完成后恢复原有钩子 add_filter('intermediate_image_sizes', function() use ($original_intermediate_sizes) { return $original_intermediate_sizes; });
方法二:通过元数据钩子跳过尺寸生成
在插入附件时,利用wp_generate_attachment_metadata钩子,针对当前上传的附件清空尺寸信息,避免生成副本。
示例代码:
// 添加临时钩子,仅针对当前上传跳过缩略图生成 add_filter('wp_generate_attachment_metadata', function($metadata, $attachment_id) { $metadata['sizes'] = []; // 用完移除钩子,不影响其他上传 remove_filter(current_filter(), __FUNCTION__); return $metadata; }, 10, 2); // 执行上传与附件插入 $upload_result = wp_handle_upload($file, $upload_overrides); if (!isset($upload_result['error'])) { $attachment = array( 'guid' => $upload_result['url'], 'post_mime_type' => $upload_result['type'], 'post_title' => sanitize_file_name($upload_result['file']), 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment($attachment, $upload_result['file']); // 触发元数据生成,此时钩子会清空尺寸 wp_generate_attachment_metadata($attach_id, $upload_result['file']); }
方法三:通过表单标识精准控制
如果你的表单有唯一标识(比如特定字段),可以通过会话或全局标记判断上传来源,仅禁用该表单的缩略图生成。
示例代码:
// 表单提交时设置标记 if ($_POST['customer_upload_form'] === 'true') { $_SESSION['skip_image_sizes'] = true; } // 在functions.php中添加钩子 add_filter('intermediate_image_sizes', function($sizes) { if (isset($_SESSION['skip_image_sizes']) && $_SESSION['skip_image_sizes']) { $sizes = []; unset($_SESSION['skip_image_sizes']); } return $sizes; });
注意:使用会话需确保WordPress已启动会话,可在init钩子中添加session_start()。
内容的提问来源于stack exchange,提问作者Mr.Coder
相关产品推荐
相关产品推荐

