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
相关产品推荐
相关产品推荐

