You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce客户订单查询功能故障:SKU搜索异常、数量显示错误

问题分析与修复方案

核心问题原因

  1. 搜索结果显示重复:结果输出循环中直接引用了外层订单遍历里最后一次循环的$sku、$name、$item变量,没有针对当前订单重新获取匹配的商品信息,导致所有结果行都显示同一个商品的数据。
  2. 数量始终为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 . '&nbsp;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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:17:28