信科网络 · 11 年只做 WordPress | 建站 / 主题 / 插件 / 商城 / 迁移 / 托管 | 累计服务 3000+ 企业 | 源码全交付
服务热线:13280692153 邮箱:web@wordpressx.com
工作日 08:30-18:0013280692153 免费诊断
首页/WordPress 教程/WordPress 用户注册:开放、审核与防机器注册
BLOG

WordPress 用户注册:开放、审核与防机器注册

分类 发布 2026-10-17

「任何人都可以注册」这个勾一旦打开,后台用户列表一周之内就能多出几百条垃圾账号,注册邮箱清一色是临时域名。要么别开,要么开之前把下面几层防护配齐,中间状态最难受——开关开着一半,既没有验证也没有审核,等于对外开放了一个写库接口。

先决定开放还是关闭

开关只有一处:「设置 → 常规 → 会员资格 → 任何人都可以注册」。勾上之后,登录页 /wp-login.php?action=register 会出现注册表单,同时「设置 → 讨论 → 新用户默认角色」开始生效。

绝大多数企业站不需要开放注册。开放的理由只有一个:站点本身提供会员内容、论坛、投稿或商城账户。如果只是想让人留言,评论本来就不需要注册,别为了「看起来功能完整」把这个开关打开,那只会给自己增加一份长期清理的工作。

关着的时候,wp-login.php?action=register 会提示注册功能已关闭,但登录、找回密码都正常,两件事互相独立,这点后面还会细说。

还有一个折中方案值得考虑:不开公开放注册,只在活动或会员招募期间临时打开,配合审核和验证码,活动结束就关掉。这样既拿到了名单,又不用长期维护一个开放的注册入口,对绝大多数中小企业站点是性价比最高的做法。

默认角色别给高

默认角色决定新注册的人一进来能做什么。WordPress 五个角色的差别很实在:

角色 能做到什么 适合谁
订阅者 subscriber 只能改自己的资料,不能进文章编辑 普通注册用户、会员
投稿者 contributor 能写草稿,不能发布、不能传媒体库外的东西 外部投稿
作者 author 能发布自己的文章 签约作者
编辑 editor 能改所有人的文章、管分类 内容负责人
管理员 administrator 全部权限,含插件、主题、用户 仅站点负责人

默认必须是订阅者。设成投稿者,等于任何人都能往后台塞草稿,你的「待审」列表会被广告塞满;设成作者,等于任何人都能直接发布内容。这两个设置在开放注册的站点上等于把内容安全交出去,而且在后台日志里很难追责。

注册后要不要审核

WordPress 没有内置审核流程,注册即生效,这点跟很多国内建站系统不一样。要实现「注册后待审」,三条路:

  1. 默认角色设成订阅者,人工在「用户 → 所有用户」里核对后改角色。最简单,适合每周只有几个注册的站点。
  2. 用插件做邮箱验证加管理员批准,注册量上到每天几十个时用这个。
  3. 自己写:注册时写入一个状态字段,登录时拦截。

自己写的好处是不依赖插件,坏处是维护成本在你身上。核心逻辑就两个钩子:

add_action( 'user_register', function( $uid ) {
    update_user_meta( $uid, 'account_status', 'pending' );
    wp_mail( get_option( 'admin_email' ), '新用户待审', '用户 ID:' . $uid );
} );

add_filter( 'wp_authenticate_user', function( $user ) {
    if ( is_wp_error( $user ) ) {
        return $user;
    }
    if ( 'pending' === get_user_meta( $user->ID, 'account_status', true ) ) {
        return new WP_Error( 'pending', '账号正在审核,通过后会邮件通知。' );
    }
    return $user;
}, 10, 1 );

审核通过时把 account_status 改成 approved,或者直接删掉这个 meta。注意 wp_authenticate_user 只拦登录,不拦已经存在的 cookie,所以改状态后最好让该用户重新登录一次。

防机器注册的四层

机器人注册不挑站点大小,只要表单能被找到就会被试。四种手段各有代价,按需组合:

手段 能拦住什么 代价
图形验证码 脚本批量提交 影响无障碍,读者多一步操作
邮箱验证链接 一次性邮箱、假地址 依赖稳定发信,必须配 SMTP
提交频率限制 短时间高频注册 公司共享出口 IP 容易误伤
蜜罐隐藏字段 自动填表的通用机器人 对定向攻击无效

企业站开「蜜罐加频率限制」基本够用;有会员体系的站点再加邮箱验证。四层全上没有必要,会把真实用户的转化率压下去。

蜜罐的实现很简单:加一个用 CSS 隐藏的输入框,正常人看不见也不会填,机器人会把所有 input 填满。

add_action( 'register_form', function() {
    echo '<p class="hp-field"><input type="text" name="website_url" value=""></p>';
} );

add_filter( 'registration_errors', function( $errors ) {
    if ( ! empty( $_POST['website_url'] ) ) {
        $errors->add( 'bot', '注册失败,请稍后再试。' );
    }
    return $errors;
} );

配套在样式表里写 .hp-field{display:none}。别用 visibility:hidden 或者把它挪到屏幕外太远处,部分机器人会跳过不可见元素,display:none 的命中率反而更高。

频率限制用 transient 按 IP 记数就够,不用上 Redis:

add_filter( 'registration_errors', function( $errors ) {
    $ip  = isset( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : '';
    $key = 'reg_' . md5( $ip );
    $n   = (int) get_transient( $key );
    if ( $n >= 3 ) {
        $errors->add( 'too_fast', '注册过于频繁,请一小时后再试。' );
    }
    set_transient( $key, $n + 1, HOUR_IN_SECONDS );
    return $errors;
} );

阈值别设成 1。一个办公室十几个人共用一个出口 IP,设太严会把真实客户挡在门外,客服电话比垃圾账号更麻烦。

邮箱验证这一步有个前提经常被忽略:PHP 的 mail() 在国内服务器上基本发不出去,25 端口被封,云厂商也默认禁用。所以「验证邮件」功能上线前必须先把 SMTP 配通,否则用户点完注册什么也收不到,第二天就来问「为什么我注册没反应」。装一个 SMTP 插件,用企业邮箱账号发信,端口走 465 或 587,配完先给自己发一封测试邮件确认能进收件箱而不是垃圾箱。

注册页怎么自定义

默认注册页由 wp-login.php 生成,样式跟站点完全不搭,字段也只有用户名和邮箱。三种改法:

  • 样式覆盖:用 login_enqueue_scripts 挂自己的 CSS,改 logo、配色、按钮,登录和注册页一起生效,改动最小。
  • 换成独立页面:建一个普通页面放自定义表单,提交到 admin-post.php,服务端用 wp_create_user 建号。
  • 用插件:Members、Ultimate Member 这类直接提供前台注册页、字段管理和审核流。

自己写表单要注意三件事:nonce 校验、用户名过滤(sanitize_user)、邮箱是否已存在。wp_create_user 失败时返回的是 WP_Error,不能直接当 ID 用:

$uid = wp_create_user( $user, $pass, $email );
if ( is_wp_error( $uid ) ) {
    // 可能是 username_exists、email_exists、illegal_user_login
    echo esc_html( $uid->get_error_message() );
}

还要处理一个常见需求:注册时让用户填公司、电话。这些字段用 add_user_meta 存,别直接往 wp_users 里加列,升级时会被覆盖。表单提交前做一次 sanitize_text_field,输出时 esc_html,两步都不能省。

关掉注册之后

取消勾选「任何人都可以注册」只影响新注册,已有用户照常登录,密码、角色、已发文章都不受影响。这是很多人担心的点,其实开关的作用范围很窄,就是注册表单本身。

但有个例外:如果你之前用插件做了前台注册页,关掉这个开关后插件可能仍然能建号,因为它走的是 wp_create_user,不看这个 option。要彻底关,得在插件设置里一起关,或者在 user_register 钩子上直接退出。

add_action( 'user_register', function( $uid ) {
    if ( ! get_option( 'users_can_register' ) && ! current_user_can( 'create_users' ) ) {
        require_once ABSPATH . 'wp-admin/includes/user.php';
        wp_delete_user( $uid );
        wp_die( '本站已关闭注册。' );
    }
} );

已经进来的垃圾账号怎么清:在「用户 → 所有用户」按注册时间排序,批量删除,删除时勾选「删除该用户的文章」,投稿者的草稿会一并清掉。删之前先导出邮箱列表存档,避免把真实客户误删。用户列表的筛选和批量操作在 后台入门 里有截图级的说明。

整套做下来,注册这件事的核心就两句:默认最小权限,至少一层人机校验。它属于 安全加固 的一部分,和登录保护、防火墙规则一起规划效果最好——机器人连登录页都摸不到的时候,注册攻击自然少一大半。如果站点还要接短信、企业微信或者商城账户体系,注册流程会更复杂,改造思路可以参考 插件定制,涉及验证码和发信的服务选型可以直接打 13280692153 问,或者走 联系我们。

INDUSTRIAL BELT

扎根中国制造产业带
懂工厂,才懂出海

从胶东半岛到珠三角,从长三角到中原腹地,每一片产业集群都有自己的出口节奏与买家画像。信科网络长期扎根产业一线,把工厂的产品语言翻译成海外采购商听得懂的搜索语言,让每一分投入都对着真实的询盘去。

yongning

永宁外贸网站建设

永宁县地处宁夏平原中部,东临黄河,西倚贺兰山,是宁夏回族自治区首府银川市的郊县。全县国土面积1020平方公里,辖五镇一乡一个街道办事处,总人口20.4万人,有汉、回、满等13个民族,其中回…

haiyuan

海原外贸网站建设

位于中国宁夏回族自治区中南部。1991年底人口31.15万。回族为主,有汉、满、蒙古、东乡等民族。西汉属安定郡。清同治十三年(1874)设海城县。民国三年(1914)改海原县。地形复杂,多山地。年…

zaoqiang

枣强外贸建站

枣强县位于河北省东南部,衡水市南端,界于东经115°35′~58′,北纬37°08′~35′之间,总面积892.3平方公里。东隔清凉江与景县、故城相望,西临冀州市,南靠邢台地区南宫市,北接桃城区、武邑县。…

qingtongxia

青铜峡外贸建站

青铜峡市位于黄河上游宁夏平原中部,地势平坦,牛首、峡口两山对峙,黄河穿峡而过,山光水色相映,宛如开然铜镜,“青铜峡”由此而得名。地处西北内陆,东部季风区与西部干旱区域的交汇地带,属…

beibei

北碚WordPress建站

北碚区位于重庆市区西北郊的缙云山下,嘉陵江畔,幅员面积753平方公里,人口63万,是重庆的风景旅游区和智力型清洁工业基地。本世纪20年代末,由爱国实业家卢作孚先生开拓,抗战时期为陪都重庆…

rongcheng

容城WordPress建站

河北省容城县,历史悠久,距今已有2000年的历史,全县总面积314平方公里,总人口25万人。地理位置得天独厚。位于河北省中部,京、津、保腹地,距首都北京和天津直辖市均为120公里,两个小时的…

tongnan

潼南Shopify建站

潼南县位于重庆市西北部最前沿。是川渝握手区腹地东西南北交通自然便捷走向的交汇点及区域几何中心,是成渝经济区的腹地中心,是重庆西部凸入川中腹地最远、毗邻四川县市最多的对外开放最前沿…

jingxian

景县Shopify建站

景县位于河北省东南部,大运河西岸,全县辖9镇7乡,849个行政村,总面积1183平方公里。全县呈簸箕形,由西南向东北逐渐倾斜坦,最高点海拔25米,最低点14.1米。属暖温带半湿润大陆性气候,四季…

xiongxian

雄县外贸推广

河北省保定市雄县位于东经116°06',北纬38°59'。平均海拔10米。处于冀中平原的京、津、保三角腹地,南倚“华北明珠”白洋淀,北靠“京南小香港”___白…

wushan

巫山外贸推广

巫山位于重庆市东北部,三峡库区腹心,素有“渝东门户”之称,地跨长江巫峡两岸。东邻湖北省巴东县,西接奉节县,南与湖北省建始县毗连,北与巫溪县及神农架林区接壤。县城位于大宁河与长江交汇…

fengdou

丰都Google SEO

丰都县位于重庆市版图中心,东经107°28′03″-108°12′37″,北纬29°33′18″-30°16′25″之间,呈西北—东南走向分布,南北长87km,东西宽54km,幅员面积2901km2。长江横穿县境47km,水上距离重庆主…

yubei

渝北Google SEO

重庆市渝北区位于重庆市区北部,是1994年12月17日经国务院批准,在撤销原江北县建制基础上设立的新区。渝北区是重庆市的行政区,原为江北县,南端为主城区一部分的龙溪镇,北端与四川省接壤,…

jinfeng

金凤GEO优化

金凤区于2002年11月1日成立,是宁夏回族自治区首府银川市的市辖区之一,位于市区中部,东到唐徕渠,西到包兰铁路,南接永宁县,北临贺兰县,辖良田、丰登2个镇,上海西路、北京中路、长城中路…

yunhe

运河GEO优化

运河区,隶属于河北省沧州市,也是沧州市政府所在地,因京杭大运河贯穿全境而命名。运河区位于沧州市区西部,总面积117.7平方公里,人口30.9万(2013年),辖1乡1镇、6个街道办事处,63个行政…

wuzhong

吴忠谷歌SEM

吴忠市位于宁夏回族自治区中部,东邻陕西定边县,西北和东北与内蒙古自治区阿拉善左旗、鄂托克前期接壤,西南和东南与甘肃靖远县、环县毗邻,北连永宁、陶乐两县,南接海原、固原两县,面积339…

kaizhou

开州谷歌SEM

开州区隶属于重庆市,位于重庆市东北部,三峡库区小江支流回水末端,介于北纬30°49′30″-31°41′30″、东经107°55′48″-108°54′之间,西邻四川省开江县,北依大巴山接城口县和四川省宣汉县,东毗云…

xiushan

秀山Facebook广告

秀山土家族苗族自治县,位于重庆市东南部,武陵山脉中段,四川盆地东南缘的外侧,为川东南重门户。与湖南省、湖北省、贵州省毗邻,326国道和319国道贯穿全县。距长沙604公里、武汉656里、贵阳5…

hengshui

衡水Facebook广告

衡水市位于河北省东南部,东与沧州市和山东省德州市毗邻,西与石家庄市接壤,南与邢台市相连,北与保定市交界;南北长125.5公里,东西宽98.13公里,全市辖8县2市1区,总面积5815.4平方公里。衡…

guyuan

固原Yandex推广

固原地区位于宁夏回族自治区南部,东西南三面与甘肃毗邻,北部与本区中卫、同心两县接壤,总面积16783平方公里,辖固原、海原、西吉、隆德、彭阳、泾源县,总人口186.85万人,其中回族占47.6%,…

nanchuan

南川TikTok推广

南川地处四川盆地东南边缘与云贵高原过渡地带,位于重庆市南部,东南与贵州省道真、正安、桐梓县接壤,东北与武隆县为邻,北接涪陵区,西连巴南区、綦江县、万盛区。总面积2602平方千米。总人…

为什么一定要选懂产业带的出海服务商?建材丝网的欧洲建筑商看资质与交期,工业橡塑的中东工程商问耐温与工况,毛皮服饰的俄罗斯分销商算的是季节与毛利。买家不同,决策逻辑就不同;信科网络把这些差异拆进网站结构、关键词地图和投放策略里,用他们习惯的方式出现在他们搜索的地方。