WooCommerce按产品类型添加订单元数据时触发空对象错误
WooCommerce订单元数据添加函数错误修复
问题描述
原有函数可正常为所有产品类型的订单添加元数据,修改后意图为Simple产品添加myfield和csku元数据,为Variable产品仅添加csku元数据,但结账时触发错误:
Error processing checkout. Please try again. CRITICAL Uncaught Error: Call to a member function is_type() on null in
原函数代码:
// Save as custom order item metadata and display on orders and email notifications add_action( 'woocommerce_checkout_create_order_line_item', 'add_csku_on_orders_and_emails', 2, 4 ); function add_csku_on_orders_and_emails( $item, $cart_item_key, $values, $order ) { $myfield = 'myfield'; // Value "my field" $csku = $values['data']->get_meta( 'csku' ); // Get product "csku" if ( ! empty( $csku ) ) { $item->add_meta_data( 'csku', $csku ); // add it as custom order item metadata $item->add_meta_data( 'myfield', $myfield ); // add it as custom order item metadata } }
错误的修改后函数代码:
// Save as custom order item metadata and display on orders and email notifications add_action( 'woocommerce_checkout_create_order_line_item', 'add_csku_on_orders_and_emails', 2, 4 ); function add_csku_on_orders_and_emails( $item, $cart_item_key, $values, $order ) { $myfield = 'myfield'; // Value "my field" $csku = $values['data']->get_meta( 'csku' ); // Get product "csku" if ( $product->is_type( 'simple' ) ) { $item->add_meta_data( 'myfield', $myfield ); // add it as custom order item meta data $item->add_meta_data( 'csku', $csku ); // add it as custom order item meta data } elseif ( $product->is_type( 'variable' ) ) { $item->add_meta_data( 'csku', $csku ); // add it as custom order item meta data } }
错误原因
修改后的函数直接使用了$product变量,但该变量从未被定义或赋值,导致调用is_type()方法时$product为null,触发空指针错误。
修复后的代码
// Save as custom order item metadata and display on orders and email notifications add_action( 'woocommerce_checkout_create_order_line_item', 'add_csku_on_orders_and_emails', 2, 4 ); function add_csku_on_orders_and_emails( $item, $cart_item_key, $values, $order ) { $myfield = 'myfield'; // Value "my field" // 获取产品对象 $product = $values['data']; // 确保产品对象存在且为WC_Product实例 if ( ! $product instanceof WC_Product ) { return; } $csku = $product->get_meta( 'csku' ); // Get product "csku" // 仅当csku非空时添加元数据 if ( ! empty( $csku ) ) { if ( $product->is_type( 'simple' ) ) { $item->add_meta_data( 'myfield', $myfield ); $item->add_meta_data( 'csku', $csku ); } elseif ( $product->is_type( 'variable' ) ) { $item->add_meta_data( 'csku', $csku ); } } }
修复说明
- 新增
$product = $values['data'];,从购物车项数据中正确获取产品对象 - 添加
$product instanceof WC_Product检查,避免产品对象为空时的错误 - 保留原函数中的
! empty( $csku )判断,避免添加空的元数据 - 基于正确的产品对象调用
is_type()方法,区分Simple和Variable产品类型
内容的提问来源于stack exchange,提问作者user20508390
相关产品推荐
相关产品推荐

