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

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上传的代码,可以在上传时设置全局标记,仅当标记存在时执行转换,避免误判其他后台操作:

  1. 在外部URL上传的代码中添加标记:
// 开始外部上传前设置标记
$GLOBALS['is_external_image_upload'] = true;

// 执行你的外部图片上传逻辑(比如wp_insert_attachment等操作)
// ...

// 上传完成后移除标记
unset($GLOBALS['is_external_image_upload']);
  1. 修改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');

方案二:取消全局钩子,仅在外部上传时手动触发

彻底避免全局钩子影响后台操作,改为在外部上传代码中手动调用转换函数:

  1. 移除原有的全局过滤器挂载,保留函数本身:
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;
}
  1. 在外部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,提问作者Вася

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:18:32