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

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 );
        }
    }
}

修复说明

  1. 新增$product = $values['data'];,从购物车项数据中正确获取产品对象
  2. 添加$product instanceof WC_Product检查,避免产品对象为空时的错误
  3. 保留原函数中的! empty( $csku )判断,避免添加空的元数据
  4. 基于正确的产品对象调用is_type()方法,区分Simple和Variable产品类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:40:56