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
相关产品推荐
相关产品推荐

