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

WordPress:商家登录时如何校验用户元数据

解决方案:商家自定义元数据管理与客户列表过滤

1. 给商家账户添加自定义识别码字段

默认WordPress用户管理面板没有自定义商家识别码的入口,咱们可以通过钩子在管理员后台的商家用户编辑页面添加专属字段,并自动保存到用户元数据中:

// 在用户编辑页面添加商家识别码字段
add_action('show_user_profile', 'add_merchant_code_field');
add_action('edit_user_profile', 'add_merchant_code_field');
function add_merchant_code_field($user) {
    // 仅对商家角色显示该字段
    if (!in_array('merchant', $user->roles)) return;
    ?>
    <h3>商家专属信息</h3>
    <table class="form-table">
        <tr>
            <th><label for="merchant_code">商家识别码</label></th>
            <td>
                <input type="text" name="merchant_code" id="merchant_code" value="<?php echo esc_attr(get_user_meta($user->ID, 'merchant_code', true)); ?>" class="regular-text" />
                <p class="description">设置该商家的唯一识别码,客户注册时将通过此码关联到您的账户</p>
            </td>
        </tr>
    </table>
    <?php
}

// 保存商家识别码到用户元数据
add_action('personal_options_update', 'save_merchant_code_field');
add_action('edit_user_profile_update', 'save_merchant_code_field');
function save_merchant_code_field($user_id) {
    // 校验管理员权限
    if (!current_user_can('edit_user', $user_id)) return;
    // 仅处理商家角色用户
    $user = get_userdata($user_id);
    if (!in_array('merchant', $user->roles)) return;
    // 安全保存字段值
    if (isset($_POST['merchant_code'])) {
        update_user_meta($user_id, 'merchant_code', sanitize_text_field($_POST['merchant_code']));
    }
}

管理员在后台编辑商家用户时,就能看到并设置唯一的merchant_code,提交后数据会自动存入用户元数据表。

2. 商家登录后过滤关联的客户列表

要实现商家仅查看自己关联的客户,咱们可以通过pre_get_users钩子修改用户查询逻辑:

// 过滤商家后台可见的客户列表
add_action('pre_get_users', 'filter_customers_for_merchant');
function filter_customers_for_merchant($query) {
    // 仅在后台用户列表页面生效,且当前登录用户是商家
    if (is_admin() && current_user_can('merchant') && $query->is_main_query()) {
        // 获取当前商家的识别码
        $current_merchant_code = get_user_meta(get_current_user_id(), 'merchant_code', true);
        if (!empty($current_merchant_code)) {
            // 添加元数据过滤条件:仅显示关联当前商家识别码的客户
            $meta_query = $query->get('meta_query', []);
            $meta_query[] = [
                'key'     => 'merchant_code',
                'value'   => $current_merchant_code,
                'compare' => '='
            ];
            $query->set('meta_query', $meta_query);
            // 强制只显示客户角色用户
            $query->set('role', 'customer');
        }
    }
}

商家登录后台查看用户列表时,系统会自动筛选出所有merchant_code与自己匹配的客户,不会看到其他商家或管理员账户。

可选:商家登录时的识别码校验

如果需要确保商家账户必须设置识别码才能登录,可以添加以下钩子:

// 商家登录时校验识别码是否存在
add_filter('wp_authenticate_user', 'validate_merchant_code_on_login', 10, 2);
function validate_merchant_code_on_login($user, $password) {
    if (in_array('merchant', $user->roles)) {
        $merchant_code = get_user_meta($user->ID, 'merchant_code', true);
        if (empty($merchant_code)) {
            return new WP_Error('no_merchant_code', '您的账户未设置商家识别码,请联系站点管理员');
        }
    }
    return $user;
}

这段代码会在商家登录时,如果未设置识别码,直接阻止登录并提示错误信息。

内容的提问来源于stack exchange,提问作者newbiedev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 20:35:26