WP DEVELOP

EP088. “开放注册、登出按钮与 Subscriber 重定向”

首页 WordPress 开发课程 用户角色与权限 · EP088
约 12 分钟· #EP088#用户角色与权限
🔒 登录后可标记已读

开放网站注册,让访客可以自助注册成权限最低的 Subscriber 账号(后续几讲会陆续给 Subscriber 开放记笔记、点赞教授等有限功能)。这一讲完成三件事:① 后台开启「任何人都可以注册」并把默认角色设为 Subscriber;② 顶部按钮做成「未登录显示登录/注册,已登录显示带头像的登出按钮」的条件判断;③ 让 Subscriber 登录后直接跳回前台首页、且看不到后台顶部工具条,不让访客账号能看到 wp-admin 后台界面。


涉及文件

  • 后台 Settings → General 开启 Membership(后台设置,无对应代码文件)
  • wp-content/themes/fictional-university-theme/header.php (修改)
  • wp-content/themes/fictional-university-theme/functions.php (修改)

代码实现

后台设置:Settings → General → 勾选 Anyone can register,New User Default Role 选 Subscriber → Save Changes。注册页面地址固定是 /wp-signup.php

[截图:wp-admin 后台 Settings → General 页面,Anyone can register 勾选框与 New User Default Role 设置为 Subscriber]

header.php:把顶部按钮改成登录状态判断(替换原本写死的 Login / Sign Up 按钮):

<!-- wp-content/themes/fictional-university-theme/header.php -->
<?php if(is_user_logged_in()) { ?>
  <a href="<?php echo wp_logout_url();  ?>" class="btn btn--small  btn--dark-orange float-left btn--with-photo">
  <span class="site-header__avatar"><?php echo get_avatar(get_current_user_id(), 60); ?></span>
  <span class="btn__text">Log Out</span>
  </a>
  <?php } else { ?>
    <a href="#" class="btn btn--small btn--orange float-left push-right">Login</a>
    <a href="<?php echo esc_url(site_url('/wp-signup.php')); ?>" class="btn btn--small  btn--dark-orange float-left">Sign Up</a>
   <?php } ?>

functions.php:Subscriber 登录后重定向到首页、隐藏后台顶部工具条(追加在文件末尾):

// wp-content/themes/fictional-university-theme/functions.php

// Redirect subscriber accounts out of admin and onto homepage
add_action('admin_init', 'redirectSubsToFrontend');

function redirectSubsToFrontend() {
  $ourCurrentUser = wp_get_current_user();

  if (count($ourCurrentUser->roles) == 1 AND $ourCurrentUser->roles[0] == 'subscriber') {
    wp_redirect(site_url('/'));
    exit;
  }
}

add_action('wp_loaded', 'noSubsAdminBar');

function noSubsAdminBar() {
  $ourCurrentUser = wp_get_current_user();

  if (count($ourCurrentUser->roles) == 1 AND $ourCurrentUser->roles[0] == 'subscriber') {
    show_admin_bar(false);
  }
}

关键改动点:

  • is_user_logged_in() 判断当前访客是否已登录,未登录才显示 Login/Sign Up;已登录显示登出按钮,此时 Login 按钮的 href="#" 还只是占位符,会在下一讲接入自定义登录页时才补上真实链接
  • wp_logout_url() 生成 WordPress 内建的登出跳转链接,点击后自动登出并可指定跳转位置
  • 登出按钮的头像用 get_avatar($user_id, $size) 输出,第一个参数用 get_current_user_id() 取当前登录用户 ID,第二个参数是像素尺寸——头像图基于 Gravatar(跟用户注册邮箱绑定的全球通用头像服务),不是 WordPress 自己存的图
  • 两个新函数判断逻辑完全一致:wp_get_current_user()->roles 是数组,用 count(...) == 1 AND ...roles[0] == 'subscriber' 判断「这个用户只有且仅有 Subscriber 这一个角色」,只对纯 Subscriber 生效,不会误伤同时兼有 Editor/自定义角色的账号
  • redirectSubsToFrontend() 挂在 admin_init 这个只在访问后台时触发的钩子上,用 wp_redirect() + exit 组合把纯 Subscriber 直接弹回首页;noSubsAdminBar() 挂在更早、几乎每次请求都会触发的 wp_loaded 上,用 show_admin_bar(false) 隐藏前台页面顶部那条黑色工具条

[截图:前台已登录状态下顶部导航栏显示的带头像登出按钮]


Hook / Function 速查

名称类型用途
is_user_logged_in()WP 内建 function判断当前访客是否已登录
wp_logout_url()WP 内建 function生成登出链接
get_avatar($user, $size)WP 内建 function输出用户头像(Gravatar)的 <img> HTML
get_current_user_id()WP 内建 function获取当前登录用户的 ID
wp_get_current_user()WP 内建 function获取当前登录用户的完整对象(含 roles 数组)
admin_initWP hook每次加载后台页面时触发
wp_loadedWP hookWordPress 核心加载完毕、几乎所有请求都会触发
wp_redirect($url)WP 内建 function服务端重定向,配合 exit 使用防止后续代码继续执行
show_admin_bar(false)WP 内建 function隐藏前台顶部的后台工具条

常见坑

  • 本地开发环境的邮件发送经常不可用(跟本地网络/防火墙设置有关),注册后收不到密码邮件属于正常现象——可以直接去后台该用户账号的编辑页面手动生成新密码,不用死等邮件
  • wp_redirect() 后忘记加 exit——不加的话重定向头已经发送,但 PHP 代码还会继续往下执行,可能导致意外的副作用或报错
  • 判断角色时只检查 roles 数组第一项、却没检查数组长度——如果账号身兼多个角色(比如 Editor + Subscriber),只看第一项可能会误判,所以要先 count() == 1 确认只有单一角色,再检查这个角色是不是 Subscriber

延伸 / 后续讲座会用到

下一讲会自定义 WordPress 默认的登录页面样式(去掉 WordPress 官方 Logo,换成网站自己的品牌样式),到时候 header.php 里那个还是 href="#" 的 Login 按钮会被接上真实链接。


Sources

Udemy:

  • Become a WordPress Developer: Unlocking Power With Code — Section 18, EP088