WooCommerce客户订单查询功能故障:SKU搜索异常、数量显示错误
问题分析与修复方案
核心问题原因
- 搜索结果显示重复:结果输出循环中直接引用了外层订单遍历里最后一次循环的
$sku、$name、$item变量,没有针对当前订单重新获取匹配的商品信息,导致所有结果行都显示同一个商品的数据。 - 数量始终为1:输出时使用的是外层循环最后一个
$item的数量,而非当前订单中匹配商品的实际购买数量。
此外原代码还有两处逻辑瑕疵:
- 搜索条件仅匹配SKU/商品名称的开头,不符合常规模糊搜索的用户预期;
- 原逻辑将整个订单加入结果集,但输出时未展示订单内所有匹配商品,逻辑不一致。
修复后的完整代码
function search_orders_by_sku_or_product_name_form() { ob_start(); ?> <form method="post" action=""> <input type="text" name="order_search" placeholder="输入SKU或商品名称"> <input type="submit" value="搜索"> </form> <?php return ob_get_clean(); } add_shortcode('order_search_form', 'search_orders_by_sku_or_product_name_form'); function search_orders_by_sku_or_product_name_result() { if (isset($_POST['order_search']) && !empty($_POST['order_search'])) { $search_term = sanitize_text_field($_POST['order_search']); $user_id = get_current_user_id(); $orders = wc_get_orders(array( 'customer' => $user_id, 'limit' => -1, )); $found_items = array(); // 改为存储匹配的商品条目,而非整个订单 foreach ($orders as $order) { $order_items = $order->get_items(); foreach ($order_items as $item) { $product = $item->get_product(); if (!$product) { continue; } $sku = $product->get_sku(); $name = $product->get_name(); // 修改为包含匹配,若需要前缀匹配可改回 ===0 if (($sku && strpos($sku, $search_term) !== false) || ($name && strpos($name, $search_term) !== false)) { // 存储订单和对应商品条目 $found_items[] = array( 'order' => $order, 'item' => $item, 'sku' => $sku, 'name' => $name ); } } } if (!empty($found_items)) { echo '<table>'; echo '<tr><th>订单号</th><th>状态</th><th>SKU</th><th>商品名称</th><th>购买数量</th><th>下单日期</th></tr>'; foreach ($found_items as $match) { $order = $match['order']; $item = $match['item']; $order_date = $order->get_date_created(); $formatted_date = $order_date->format('d/m/Y H:i'); $order_status = wc_get_order_status_name($order->get_status()); echo '<tr>'; echo '<td>#' . $order->get_id() . '</td>'; echo '<td>' . $order_status . '</td>'; echo '<td>' . $match['sku'] . '</td>'; echo '<td>' . $match['name'] . '</td>'; echo '<td>' . $item->get_quantity() . '</td>'; echo '<td>' . $formatted_date . ' Hs.</td>'; echo '</tr>'; } echo '</table>'; } else { echo '暂无匹配结果。'; } } } add_shortcode('order_search_result', 'search_orders_by_sku_or_product_name_result');
关键修改点说明
- 数据存储结构调整:将
$found_orders改为$found_items,存储每个匹配的商品条目及其关联订单,确保每个结果行对应正确的商品数据。 - 输出逻辑修正:在结果循环中直接从存储的匹配数据中获取订单、商品、SKU、名称和数量,避免引用外层循环的遗留变量。
- 搜索逻辑优化:将前缀匹配改为包含匹配,更符合常规搜索需求(若需保留前缀匹配,可将
!== false改回=== 0)。 - 代码简化:直接使用
$order->get_id()和$order->get_status()替代get_data(),更符合WooCommerce的最佳实践。
内容的提问来源于stack exchange,提问作者Hype
相关产品推荐
相关产品推荐

