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

WooCommerce:woocommerce_new_order钩子中wc_get_product返回空的问题

在WooCommerce订单处理钩子中获取产品对象的问题解决

问题场景

在woocommerce_new_order、woocommerce_payment_complete这类订单处理钩子的回调函数中,调用wc_get_product()获取非订单内的产品对象,一开始误以为函数返回空对象,但相同代码在woocommerce_single_product_summary等页面钩子中可正常运行。

核心原因

你遇到的并非wc_get_product()失效——该函数实际能正确获取到产品对象,问题出在调试方式上:error_log(json_encode(wc_get_product($id)))返回空,是因为WC_Product是包含不可序列化属性(如资源引用、内部闭包)的复杂PHP对象,json_encode()无法直接将其转换为JSON字符串,导致输出为空,进而让你误以为产品对象未被获取。

解决方法

如果需要提取产品信息用于构建请求或调试,不要直接序列化整个WC_Product对象,而是通过产品对象的getter方法提取所需属性:

add_action( 'woocommerce_new_order', 'send_new_order', 9999, 3 );
function send_new_order( $order_id, $order )
{
    // 其他代码...

    $bottles_of_the_moment_ids = get_field('bottles_of_the_moment', 'option');

    foreach ($bottles_of_the_moment_ids as $bottle_id) {
        $product = wc_get_product($bottle_id);
        // 提取需要的产品字段
        $line_items[] = array(
            'product_id' => $product->get_id(),
            'name'       => $product->get_name(),
            'price'      => $product->get_regular_price(),
            'sku'        => $product->get_sku()
            // 按需添加其他属性
        );
    }

    $body = array(
        // 订单其他信息
        'line_items' => $line_items,
        // 更多订单信息
    );

    $raw_response = wp_remote_post( $live_url,
        array(
            'headers' => array( 'Content-Type' => 'application/json' ),
            'timeout' => 30,
            'body' => json_encode( $body ),
        )
    );
}

补充说明

订单处理钩子运行在WordPress后台环境,调试时依赖error_log这类日志输出,而复杂对象的直接序列化会失败;页面钩子运行在前端环境,用var_dump或print_r能直接看到对象结构,因此不会出现类似误解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:12:40