在WooCommerce订单接收页和通知邮件中显示自定义订单元数据
修复方案:在WooCommerce订单接收页显示产品自定义元数据
问题根源
你的代码核心错误在于:从订单对象而非产品/订单项对象获取元数据,同时存在按商品数量重复输出的冗余逻辑,且未做安全输出处理。
修复后的代码
// 在订单接收(感谢)页面显示产品自定义元数据 public function display_order_product_custom_meta( $order_id ) { // 定义字段键与对应显示标签(可根据需求修改标签文字) $fields = array( 'selected_pdv' => '自提点', 'selected_date' => '选择日期', 'selected_hour' => '选择时段' ); $order = wc_get_order( $order_id ); if ( ! $order ) return; // 遍历每个订单项 foreach ( $order->get_items() as $item_id => $item ) { // 获取订单项关联的产品对象 $product = $item->get_product(); if ( ! $product ) continue; // 显示商品名称(可选,用于区分不同商品) echo '<h6>' . esc_html( $item->get_name() ) . '</h6>'; echo '<table><tbody>'; // 遍历输出每个自定义字段 foreach( $fields as $meta_key => $label ){ // 从产品元数据中获取值 $meta_value = $product->get_meta( $meta_key ); // 仅当值存在时才输出 if ( ! empty( $meta_value ) ) { echo '<tr><th>' . esc_html( $label ) . ':</th><td>' . esc_html( $meta_value ) . '</td></tr>'; } } echo '</tbody></table>'; } } add_action('woocommerce_thankyou', array($this, 'display_order_product_custom_meta') );
关键修复点
- 修正数据源:从产品对象
$product->get_meta()获取自定义字段,而非订单对象,匹配你"产品元数据"的需求。- 如果你的自定义字段是在添加购物车时保存到订单项元数据中,将
$product->get_meta( $meta_key )替换为$item->get_meta( $meta_key )即可。
- 如果你的自定义字段是在添加购物车时保存到订单项元数据中,将
- 优化显示逻辑:移除按商品数量重复输出的冗余循环,同一个商品的自定义信息仅显示一次。
- 安全与容错:使用
esc_html()转义输出内容避免XSS风险,增加订单/产品对象的有效性判断,防止空对象报错。 - 友好标签:将纯字段键替换为用户易懂的中文标签,提升页面可读性。
内容的提问来源于stack exchange,提问作者OHICT
相关产品推荐
相关产品推荐

