WordPress实现访客浏览指定页数后强制注册登录的方法
WordPress匿名访客浏览阈值强制登录实现方案
核心逻辑很简单:只对未登录访客做浏览计数,累计达到设置的免费页数阈值后,拦截访问并跳转到登录/注册页,已登录用户直接跳过所有校验,正常访问全站内容。
轻量代码实现(无插件依赖,性能最好)
直接把代码加到当前主题的functions.php文件里,或者用代码片段插件插入即可,不需要额外安装功能插件。
- 基础版(Cookie计数,适合绝大多数站点)
add_action('template_redirect', 'count_guest_page_views'); function count_guest_page_views() { // 跳过已登录用户、后台页面、登录/注册/找回密码页,避免跳转死循环 if (is_user_logged_in() || is_admin() || is_page(['login', 'register', 'reset-password'])) { return; } // 跳过爬虫、Feed、AJAX接口、定时任务,不影响SEO和站点正常运行 if (is_feed() || is_robots() || wp_doing_ajax() || wp_doing_cron()) { return; } // 在这里修改你要设置的匿名免费浏览页数 $free_view_limit = 5; $current_views = 0; // 读取Cookie中存储的累计浏览数 if (isset($_COOKIE['guest_page_views'])) { $current_views = intval($_COOKIE['guest_page_views']); } // 计数+1,更新Cookie,有效期设7天 $current_views++; setcookie('guest_page_views', $current_views, time() + 7 * 24 * 60 * 60, COOKIEPATH, COOKIE_DOMAIN); // 达到阈值直接跳转登录页,登录后自动返回当前访问的页面 if ($current_views >= $free_view_limit) { wp_redirect(wp_login_url(get_permalink())); exit; } }
注意点:
代码里的
$free_view_limit变量直接改数字即可,比如填10就是匿名访客最多可浏览10页如果用的是自定义登录/注册页,把
is_page(['login', 'register', 'reset-password'])里的页面别名换成自己站点对应的页面slug就行基础版的缺陷是用户清理浏览器Cookie后计数会重置,可以绕过限制,对普通访客完全够用,不需要额外处理
增强版(加IP校验,减少绕过)
如果要降低用户清Cookie绕过的概率,可以在基础版的计数逻辑里加一段IP维度的临时计数,用WordPress自带的Transient API存储即可,不需要修改数据库结构:
// 加在$current_views++之后,阈值判断之前 $user_ip = $_SERVER['REMOTE_ADDR']; $ip_cache_key = 'guest_view_count_' . md5($user_ip); $ip_record_views = get_transient($ip_cache_key) ?: 0; // Cookie计数和IP计数取最大值,避免清Cookie绕过 $current_views = max($current_views, $ip_record_views); // IP计数存24小时自动过期 set_transient($ip_cache_key, $current_views, 24 * 60 * 60);
注意:IP校验可能会对共用出口IP的场景(比如公司内网、校园网)造成误伤,流量大、公开性强的站点不建议开启。
无代码插件实现(适合完全不想碰代码的场景)
直接在WordPress后台插件库搜索「访客内容限制」「匿名浏览限制」类的插件,选近1年有更新、兼容当前WordPress版本的安装即可。这类插件一般都自带可视化设置页,直接填免费浏览页数、选择跳转的登录注册页就能用。
缺点是插件会额外加载不少前端资源,性能比手写代码差,部分插件还会带冗余的推广功能,选的时候注意甄别。
必看避坑点
- 必须把登录、注册、找回密码页加入拦截排除列表,不然访客到阈值后会无限跳转,根本进不了登录页
- 一定要加爬虫跳过逻辑,不然会拦截搜索引擎抓取,直接影响站点SEO
- 如果站点开了全页静态缓存,把
guest_page_views这个Cookie名加到缓存插件的「不缓存规则」里,不然计数逻辑会因为静态缓存不生效 - 跳转登录的时候记得带上当前页面的地址参数,用户登录后直接跳回之前想访问的页面,不用重新找内容,体验会好很多
内容的提问来源于stack exchange,提问作者DavidK
相关产品推荐
相关产品推荐

