WooCommerce中ACF字段存入订单元数据及多场景显示问题求助
解决WooCommerce同步ACF字段到购物车及订单的问题
你的代码存在参数错误、变量未定义、钩子用法过时、数据未正确存储/输出等问题,以下是修正后的完整代码,可实现ACF字段从产品页到购物车、订单的同步显示与存储:
// 产品页面显示ACF字段 add_action( 'woocommerce_before_add_to_cart_button', 'display_acf_single_product_pages', 1 ); function display_acf_single_product_pages() { global $product; $calories = get_field( 'acf-calories', $product->get_id() ); $delivery_date = get_field( 'acf-delivery_date', $product->get_id() ); // 输出字段内容(按需调整HTML结构) if ( $calories ) { echo '<p><strong>卡路里:</strong>' . esc_html( $calories ) . '</p>'; } if ( $delivery_date ) { echo '<p><strong>配送日期:</strong>' . esc_html( $delivery_date ) . '</p>'; } } // 将ACF字段保存为购物车项自定义数据 add_filter( 'woocommerce_add_cart_item_data', 'save_acf_as_cart_item_data', 10, 2 ); function save_acf_as_cart_item_data( $cart_item_data, $product_id ) { // 获取产品的ACF字段值 $calories = get_field( 'acf-calories', $product_id ); $delivery_date = get_field( 'acf-delivery_date', $product_id ); // 将字段值存入购物车项数据 if ( $calories ) { $cart_item_data['acf-calories'] = $calories; } if ( $delivery_date ) { $cart_item_data['acf-delivery_date'] = $delivery_date; } // 添加唯一键确保同一产品多次添加时数据独立 $cart_item_data['unique_key'] = md5( microtime() . rand() ); return $cart_item_data; } // 从会话中恢复购物车项的ACF数据 add_action( 'woocommerce_get_cart_item_from_session', 'cart_item_from_session', 99, 3 ); function cart_item_from_session( $cart_item, $values, $key ) { // 恢复ACF字段到购物车项 if ( isset( $values['acf-calories'] ) ) { $cart_item['acf-calories'] = $values['acf-calories']; } if ( isset( $values['acf-delivery_date'] ) ) { $cart_item['acf-delivery_date'] = $values['acf-delivery_date']; } return $cart_item; } // 购物车和结账页面显示ACF字段 add_filter( 'woocommerce_get_item_data', 'display_acf_on_cart_and_checkout', 10, 2 ); function display_acf_on_cart_and_checkout( $cart_data, $cart_item ) { // 添加卡路里到购物车显示 if ( isset( $cart_item['acf-calories'] ) ) { $cart_data[] = array( 'key' => '卡路里', 'value' => esc_html( $cart_item['acf-calories'] ) ); } // 添加配送日期到购物车显示 if ( isset( $cart_item['acf-delivery_date'] ) ) { $cart_data[] = array( 'key' => '配送日期', 'value' => esc_html( $cart_item['acf-delivery_date'] ) ); } return $cart_data; } // 将ACF字段保存到订单项,并在订单和邮件中显示 add_action( 'woocommerce_checkout_create_order_line_item', 'display_acf_on_orders_and_emails', 10, 4 ); function display_acf_on_orders_and_emails( $item, $cart_item_key, $values, $order ) { // 添加卡路里到订单项 if ( isset( $values['acf-calories'] ) ) { $item->add_meta_data( 'acf-calories', $values['acf-calories'] ); } // 添加配送日期到订单项 if ( isset( $values['acf-delivery_date'] ) ) { $item->add_meta_data( 'acf-delivery_date', $values['acf-delivery_date'] ); } } // 修改后台订单项的元数据显示标签 add_filter('woocommerce_order_item_display_meta_key', 'filter_wc_order_item_display_meta_key', 10, 3 ); function filter_wc_order_item_display_meta_key( $display_key, $meta, $item ) { if( is_admin() && $item->get_type() === 'line_item' ) { if( $meta->key === 'acf-calories' ) { $display_key = __("卡路里", "woocommerce"); } if( $meta->key === 'acf-delivery_date' ) { $display_key = __("配送日期", "woocommerce"); } } return $display_key; }
关键修改说明:
- 产品页面显示:原代码只获取字段值未输出,新增
echo语句将字段内容显示在加入购物车按钮上方,可按需调整HTML样式。 - 购物车数据存储:修正
woocommerce_add_cart_item_data的参数,正确通过get_field获取ACF值并存入购物车项数据,确保返回处理后的变量。 - 会话数据恢复:修正钩子参数,从会话值中恢复ACF字段到购物车项,保证页面刷新后数据不丢失。
- 购物车/结账显示:从购物车项数据中读取ACF值,添加到显示数组并返回,确保字段在购物车和结账页面正常展示。
- 订单数据存储:使用官方推荐的
woocommerce_checkout_create_order_line_item钩子,通过$item->add_meta_data将ACF字段存入订单项,替代过时的旧钩子。 - 变量与参数修正:修复所有未定义变量、参数引用错误的问题,确保每个函数逻辑合法。
内容的提问来源于stack exchange,提问作者Lady Murasaki
相关产品推荐
相关产品推荐

