WooCommerce可变商品订单项元数据首次获取为空问题求助
解决WooCommerce可变商品订单项短描述首次不显示的问题
遇到这个可变商品订单项短描述首次加载为空、编辑后才显示的问题,其实是WooCommerce的默认逻辑导致的:简单商品的订单项创建时会自动带上一些元数据,但可变商品的变体订单项在首次生成订单时,并不会主动把商品短描述保存为订单项元数据,只有当你手动编辑订单项时,系统才会重新处理并保存相关数据,这才让短描述显示出来。
解决方案代码
要彻底解决这个问题,我们需要在订单创建时主动把商品短描述保存为订单项的自定义元数据,而不是等到显示时才去获取。下面是完整的代码:
1. 保存短描述到订单项元数据
/** * 订单创建时保存商品短描述到订单项元数据 */ add_action( 'woocommerce_checkout_create_order_line_item', 'save_product_short_description_to_order_item', 10, 4 ); function save_product_short_description_to_order_item( $item, $cart_item_key, $values, $order ) { // 获取当前购物车项对应的商品对象(可变商品会自动获取变体) $product = $values['data']; // 获取商品的短描述(变体无设置时会继承父商品的短描述) $short_description = $product->get_short_description(); // 仅当短描述不为空时添加元数据 if ( ! empty( $short_description ) ) { // 添加元数据,第三个参数为true表示在后台订单项编辑界面可见 $item->add_meta_data( __( '商品短描述', 'woocommerce' ), $short_description, true ); } }
2. 在订单项中显示短描述
如果需要自定义短描述的显示位置(比如在默认元数据之前),可以用这个钩子:
/** * 在订单项元数据区域显示商品短描述 */ add_action( 'woocommerce_before_order_itemmeta', 'display_order_item_short_description', 10, 3 ); function display_order_item_short_description( $item_id, $item, $product ) { // 只处理商品类型的订单项(排除运费、税费等其他类型) if ( $item->get_type() !== 'line_item' ) { return; } // 获取我们之前保存的短描述元数据 $short_description = $item->get_meta( __( '商品短描述', 'woocommerce' ) ); if ( ! empty( $short_description ) ) { // 安全输出短描述,使用wp_kses_post过滤HTML标签 echo '<p><strong>' . __( '商品短描述:', 'woocommerce' ) . '</strong> ' . wp_kses_post( $short_description ) . '</p>'; } }
代码解释
- 保存逻辑:通过
woocommerce_checkout_create_order_line_item钩子,在用户完成 checkout 生成订单的瞬间,就把对应商品(包括变体)的短描述作为自定义元数据添加到订单项中。这样不管是简单商品还是可变商品,订单项从一开始就带有短描述数据,不会出现首次加载为空的情况。 - 显示逻辑:通过
woocommerce_before_order_itemmeta钩子,在订单项的默认元数据之前显示短描述,同时做了类型判断和安全过滤,确保只在商品订单项中显示,并且输出的内容符合WordPress的安全规范。
把这段代码添加到你的主题functions.php文件或者自定义插件中,就能解决可变商品订单项短描述首次不显示的问题了。
内容的提问来源于stack exchange,提问作者rmbits
相关产品推荐
相关产品推荐

