如何在WooCommerce中通过已购产品ID获取对应订单ID?
获取已购特定产品的订单ID(WooCommerce)
嘿,咱们一步步来解决这个问题~先说说你之前的代码为啥跑不起来:
- 第一段代码里
new wc_get_order( $order_id )是错的,wc_get_order()本身就是WooCommerce的内置函数,不需要用new来实例化,直接调用就行; - 第二段代码里的
get_order_ids_from_bought_items()根本不是WooCommerce自带的函数,自然会报错啦。
下面给你两种靠谱的解决方案,按需选用:
方法1:用WooCommerce内置函数查当前用户的订单
如果你要找当前登录用户买过指定产品的订单ID,用这个代码就很稳妥:
// 先定义你要找的产品ID数组 $target_product_ids = array(37, 53); $user_id = get_current_user_id(); // 获取用户所有已完成的订单(可以根据需求调整订单状态) $customer_orders = wc_get_orders(array( 'customer_id' => $user_id, 'status' => array('completed'), // 还能加'processing'、'on-hold'这些状态 'limit' => -1, // 表示获取所有符合条件的订单 )); $matching_order_ids = array(); // 遍历每个订单,检查里面的商品 foreach ($customer_orders as $order) { foreach ($order->get_items() as $item) { $product_id = $item->get_product_id(); // 如果当前商品ID在目标数组里,就记录订单ID if (in_array($product_id, $target_product_ids)) { $matching_order_ids[] = $order->get_id(); break; // 避免同一个订单被重复添加 } } } // 去重,防止同一订单有多个目标产品时重复记录 $matching_order_ids = array_unique($matching_order_ids); // 输出结果,你可以根据需求改成echo或者其他处理方式 print_r($matching_order_ids);
方法2:直接查数据库(效率更高)
如果需要批量查询,或者不想依赖WooCommerce的函数(不推荐日常用,但特殊场景下可以),可以用WPDB直接查数据库:
global $wpdb; $target_product_ids = array(37, 53); $product_ids_str = implode(',', $target_product_ids); // 从订单商品表中查询包含目标产品的订单ID $order_ids = $wpdb->get_col( "SELECT DISTINCT order_id FROM {$wpdb->prefix}woocommerce_order_items AS order_items LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS itemmeta ON order_items.order_item_id = itemmeta.order_item_id WHERE itemmeta.meta_key = '_product_id' AND itemmeta.meta_value IN ($product_ids_str) AND order_items.order_item_type = 'line_item'" ); // 输出结果 print_r($order_ids);
小提醒
- 如果要包含变体产品,记得在方法1里额外检查
$item->get_variation_id(),把变体ID也加入判断; - 方法1里的
status参数可以灵活调整,比如你想包含处理中的订单,就改成array('completed', 'processing'); - 这些代码最好放在主题的
functions.php里或者自定义插件中,不要直接在前端页面裸写哦。
内容的提问来源于stack exchange,提问作者Praveen
相关产品推荐
相关产品推荐

