WordPress:如何区分手动/函数上传图片并跳过缩略图转换?
解决WordPress仅外部URL上传时执行图片转换的问题
方案一:在现有函数中添加判断条件,排除后台手动上传场景
你可以通过判断操作上下文,仅在非后台手动上传时执行转换逻辑,推荐两种可靠的判断方式:
方式1:通过后台屏幕场景判断
在函数开头加入代码,检查当前是否处于媒体库手动上传的后台页面,若是则直接返回原数据:
function replace_uploaded_image($image_data) { // 排除后台媒体库手动上传的情况 if (is_admin()) { $screen = get_current_screen(); // 检查当前是否是媒体库或上传操作页面 if ($screen && in_array($screen->base, ['media', 'upload'])) { return $image_data; } } if (!isset($image_data['sizes']['thumbnail'])) return $image_data; // 原有转换逻辑保持不变 $upload_dir = wp_upload_dir(); $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file']; $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],'/')); $thumbnail_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['thumbnail']['file']; unlink($uploaded_image_location); rename($thumbnail_image_location,$uploaded_image_location); $image_data['width'] = $image_data['sizes']['thumbnail']['width']; $image_data['height'] = $image_data['sizes']['thumbnail']['height']; unset($image_data['sizes']['thumbnail']); return $image_data; } add_filter('wp_generate_attachment_metadata','replace_uploaded_image');
方式2:通过自定义标记精准判断(推荐)
如果你能控制外部URL上传的代码,可以在上传时设置全局标记,仅当标记存在时执行转换,避免误判其他后台操作:
- 在外部URL上传的代码中添加标记:
// 开始外部上传前设置标记 $GLOBALS['is_external_image_upload'] = true; // 执行你的外部图片上传逻辑(比如wp_insert_attachment等操作) // ... // 上传完成后移除标记 unset($GLOBALS['is_external_image_upload']);
- 修改
replace_uploaded_image函数,检查标记是否存在:
function replace_uploaded_image($image_data) { // 仅当存在外部上传标记时才执行转换 if (!isset($GLOBALS['is_external_image_upload']) || !$GLOBALS['is_external_image_upload']) { return $image_data; } if (!isset($image_data['sizes']['thumbnail'])) return $image_data; // 原有转换逻辑保持不变 $upload_dir = wp_upload_dir(); $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file']; $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],'/')); $thumbnail_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['thumbnail']['file']; unlink($uploaded_image_location); rename($thumbnail_image_location,$uploaded_image_location); $image_data['width'] = $image_data['sizes']['thumbnail']['width']; $image_data['height'] = $image_data['sizes']['thumbnail']['height']; unset($image_data['sizes']['thumbnail']); return $image_data; } add_filter('wp_generate_attachment_metadata','replace_uploaded_image');
方案二:取消全局钩子,仅在外部上传时手动触发
彻底避免全局钩子影响后台操作,改为在外部上传代码中手动调用转换函数:
- 移除原有的全局过滤器挂载,保留函数本身:
function replace_uploaded_image($image_data) { if (!isset($image_data['sizes']['thumbnail'])) return $image_data; // 原有转换逻辑保持不变 $upload_dir = wp_upload_dir(); $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file']; $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],'/')); $thumbnail_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['thumbnail']['file']; unlink($uploaded_image_location); rename($thumbnail_image_location,$uploaded_image_location); $image_data['width'] = $image_data['sizes']['thumbnail']['width']; $image_data['height'] = $image_data['sizes']['thumbnail']['height']; unset($image_data['sizes']['thumbnail']); return $image_data; }
- 在外部URL上传的代码中,生成元数据后手动调用并更新:
// 假设已完成外部图片下载,得到$attachment_id和$file路径 $metadata = wp_generate_attachment_metadata($attachment_id, $file); // 手动应用图片转换逻辑 $metadata = replace_uploaded_image($metadata); // 更新附件元数据 wp_update_attachment_metadata($attachment_id, $metadata);
内容的提问来源于stack exchange,提问作者Вася
相关产品推荐
相关产品推荐

