如何在WooCommerce REST API的line_items中添加含常规价格的meta_data
在WooCommerce REST API的line_items中获取常规价格的解决方案
要在REST API返回的line_items里拿到商品常规价格并判断折扣,单独用wc_add_order_item_meta没用是因为它只负责存储元数据,但REST API默认不会返回自定义元数据,且得确保元数据在订单创建时就被正确写入。下面是两种可行方案:
方案1:保存订单创建时的常规价格快照(推荐)
这种方式会在订单生成时,把当时的商品常规价格存为订单项元数据,后续API返回的是订单创建时的原价,不受商品后续价格变动影响。
1.1 写入常规价格到订单项
用woocommerce_checkout_create_order_line_item钩子在订单创建流程中写入元数据:
add_action('woocommerce_checkout_create_order_line_item', 'save_order_item_regular_price_snapshot', 10, 4); function save_order_item_regular_price_snapshot($item, $cart_item_key, $values, $order) { $product = $values['data']; $regular_price = $product->get_regular_price(); // 用下划线前缀隐藏元数据(前台不显示) $item->update_meta_data('_regular_price_snapshot', $regular_price); }
1.2 修改REST API响应添加字段
用woocommerce_rest_prepare_order_line_item钩子把保存的元数据加入API返回结果:
add_filter('woocommerce_rest_prepare_order_line_item', 'expose_regular_price_in_rest', 10, 3); function expose_regular_price_in_rest($response, $item, $request) { $regular_price = $item->get_meta('_regular_price_snapshot'); if (!empty($regular_price)) { $response->data['regular_price'] = $regular_price; // 直接添加折扣判断字段 $response->data['has_discount'] = (float)$regular_price > (float)$item->get_total(); } return $response; }
方案2:实时获取商品当前常规价格
如果不需要订单创建时的快照,而是想拿到商品最新的常规价格,可直接在API响应时查询产品数据:
add_filter('woocommerce_rest_prepare_order_line_item', 'add_live_regular_price_to_rest', 10, 3); function add_live_regular_price_to_rest($response, $item, $request) { $product = wc_get_product($item->get_product_id()); if ($product) { $regular_price = $product->get_regular_price(); $response->data['regular_price'] = $regular_price; $response->data['has_discount'] = (float)$regular_price > (float)$item->get_total(); } return $response; }
注意事项
- 方案1需要重新创建订单测试,历史订单不会自动补存元数据;方案2无需创建新订单,直接生效。
- 避免在外部直接调用
wc_add_order_item_meta,订单创建钩子能确保每个订单项都被正确处理,不会遗漏。 - 字段添加后,调用订单详情API(如
GET /wp-json/wc/v3/orders/{id})就能在line_items数组里看到regular_price和has_discount字段。
内容的提问来源于stack exchange,提问作者lumacode
相关产品推荐
相关产品推荐

