EP088. “开放注册、登出按钮与 Subscriber 重定向”
🔒 登录后可标记已读开放网站注册,让访客可以自助注册成权限最低的 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_init | WP hook | 每次加载后台页面时触发 |
wp_loaded | WP hook | WordPress 核心加载完毕、几乎所有请求都会触发 |
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