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

HPOS模式下WooCommerce我的账户订单页搜索表单无结果求助

修复WooCommerce HPOS模式下我的账户订单搜索功能

以下是针对你的问题的完整修复方案,解决HPOS兼容性问题并实现所需的搜索功能:

主要问题分析

  1. HPOS不兼容: 原代码使用meta_query,但HPOS模式下订单存储在自定义表中(而非post meta),因此该方式无效。
  2. 字段名错误: 原代码使用shipping_first_name等旧post meta键,HPOS中配送信息存储在wc_order_addresses表,字段名为first_name/last_name。
  3. 角色范围: 原代码仅对管理员/店铺经理开放搜索,需调整为包含批发代发货客户角色。

修复后的完整代码

// 在我的账户订单页面添加搜索表单
function add_search_to_orders() {
    // 替换为你的批发代发货客户角色slug,示例为'wholesale_customer'
    $allowed_roles = array('administrator', 'shop_manager', 'wholesale_customer');
    $user = wp_get_current_user();
    $user_roles = (array) $user->roles;

    if (array_intersect($allowed_roles, $user_roles)) {
        $show_clear_link = isset($_GET['search_orders']) && !empty($_GET['search_orders']);
        ?>
        <form method="get" id="orders-search-form" style="margin-bottom: 20px;">
            <input type="text" name="search_orders" placeholder="搜索订单号、配送姓名..." value="<?php echo isset($_GET['search_orders']) ? esc_attr($_GET['search_orders']) : ''; ?>" />
            <button type="submit">搜索</button>
            <?php if ($show_clear_link) : ?>
                <a href="<?php echo esc_url(remove_query_arg('search_orders')); ?>" style="margin-left: 10px;">重置搜索</a>
            <?php endif; ?>
            <!-- 保留分页参数 -->
            <?php if (isset($_GET['paged'])) : ?>
                <input type="hidden" name="paged" value="<?php echo esc_attr($_GET['paged']); ?>" />
            <?php endif; ?>
        </form>
        <?php
    }
}
add_action('woocommerce_before_account_orders', 'add_search_to_orders');

// 处理订单搜索查询(HPOS兼容)
function search_orders_query($args) {
    global $wpdb;

    if (isset($_GET['search_orders']) && !empty($_GET['search_orders'])) {
        $search_term = sanitize_text_field($_GET['search_orders']);
        $search_term = wc_clean($search_term);
        $search_term = esc_sql($search_term);

        // 关联配送地址表(仅一次)
        if (!strpos($args['join'], 'wc_order_addresses')) {
            $args['join'] .= " LEFT JOIN {$wpdb->prefix}wc_order_addresses addresses ON orders.id = addresses.order_id AND addresses.address_type = 'shipping' ";
        }

        // 添加搜索条件:订单号、配送姓名
        $args['where'] .= "
            AND (
                orders.order_number LIKE '%{$search_term}%'
                OR addresses.first_name LIKE '%{$search_term}%'
                OR addresses.last_name LIKE '%{$search_term}%'
            )
        ";
    }

    return $args;
}
add_filter('woocommerce_my_account_my_orders_query', 'search_orders_query', 10, 1);

关键修复点说明

  • 角色调整: 修改$allowed_roles数组,加入你的批发客户角色slug(比如wholesale_customer)。
  • HPOS适配: 使用直接SQL关联wc_order_addresses表获取配送信息,替代原post meta查询。
  • 字段修正: 使用HPOS表中的first_name/last_name字段,而非旧版post meta键。
  • 安全处理: 通过esc_sql、wc_clean等函数确保搜索参数安全,防止SQL注入。
  • 分页保留: 添加隐藏字段保存当前分页参数,避免搜索后回到第一页。
  • 代码可读性: 改用PHP模板标签输出表单,更易维护。

内容的提问来源于stack exchange,提问作者Two Pines Brian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:17:32