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

WordPress插件Cron调用wc_rest_set_uploaded_image_as_attachment失败问题

WordPress Cron执行WooCommerce图片上传失败的解决方案

问题分析

手动在后台或通过插件按钮执行时图片上传正常,但Cron定时执行时出现两个核心错误:

  1. Uncaught Error: Cannot use object of type WP_Error as array:wc_rest_upload_image_from_url返回了错误对象而非预期数组,后续传入wc_rest_set_uploaded_image_as_attachment导致报错。
  2. Invalid image: 抱歉,您不允许上传此文件类型。:Cron执行时缺乏用户权限上下文,触发文件类型验证失败。

Cron默认以匿名进程执行,没有前端登录的会话权限,导致WooCommerce的REST上传函数无法通过权限和文件类型校验。

解决方案

1. 给Cron任务赋予管理员权限上下文

在Cron任务执行前,模拟管理员登录,确保进程拥有足够权限:

// 在Cron钩子触发时先设置管理员上下文
function cron_setup_admin_context() {
    // 获取管理员用户(ID为1通常是默认管理员,可根据实际修改)
    $admin_user = get_user_by('id', 1);
    if ($admin_user) {
        wp_set_current_user($admin_user->ID);
        wp_set_auth_cookie($admin_user->ID);
    }
}
// 替换成你的Cron钩子名称,优先级设为1确保先执行
add_action('your_custom_cron_hook', 'cron_setup_admin_context', 1);

2. 调整文件类型验证规则

针对Cron执行场景,临时放宽WooCommerce的图片上传MIME类型限制(避免全局修改影响前台安全):

// 允许Cron执行时上传指定图片类型
function cron_allow_image_mime_types($allowed_types) {
    // 添加需要支持的图片类型,根据实际需求调整
    $allowed_types['webp'] = 'image/webp';
    $allowed_types['png'] = 'image/png';
    $allowed_types['jpg'] = 'image/jpeg';
    $allowed_types['jpeg'] = 'image/jpeg';
    return $allowed_types;
}

// 在Cron任务中添加过滤钩子,优先级设为2,确保在权限设置后执行
add_action('your_custom_cron_hook', function() {
    add_filter('woocommerce_rest_upload_image_mime_types', 'cron_allow_image_mime_types');
}, 2);

3. 增加错误判断与日志记录

在调用上传函数前,先判断返回值是否为错误对象,避免后续代码崩溃,并记录错误便于排查:

// 替换成你的图片上传逻辑
$image_url = wc_rest_upload_image_from_url($pic_url_r, $pro_id);

// 检查上传是否出错
if (is_wp_error($image_url)) {
    // 记录错误到WP日志
    error_log('Cron图片上传失败:' . $image_url->get_error_message());
    return; // 终止后续执行
}

$image_id1 = wc_rest_set_uploaded_image_as_attachment($image_url, $pro_id);

4. 确保WooCommerce REST函数加载正常

若Cron执行时相关函数未被自动加载,手动引入文件:

// 检查函数是否存在,不存在则加载文件
if (!function_exists('wc_rest_upload_image_from_url')) {
    require_once WP_PLUGIN_DIR . '/woocommerce/includes/wc-rest-functions.php';
}

注意事项

  • 替换代码中的your_custom_cron_hook为实际使用的Cron钩子名称。
  • 管理员ID或用户名需根据实际站点调整,优先使用ID避免用户名变更影响。
  • 完成测试后,可根据实际上传的图片类型,精简cron_allow_image_mime_types中的允许类型,保证安全性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:57:12