如何修改WordPress代码实现未登录用户仅可访问指定页面,其余页面跳转至登录页?
如何修改WordPress代码实现未登录用户仅可访问指定页面,其余页面跳转至登录页?
嗨,我看了你遇到的问题啦,原代码的核心问题确实出在条件判断的逻辑上,咱们一步步来修正:
先说说原代码的问题
你写的条件(empty($behind_login_pages) && in_array($page_id, $behind_login_pages)) && !is_user_logged_in()逻辑完全搞反了:
empty($behind_login_pages)会判断数组是否为空,但你已经定义了有内容的数组,这个判断永远返回false,导致整个条件永远不成立- 我们需要的逻辑是:当用户未登录,且当前页面不在允许访问的白名单里时,才跳转到登录页
修正后的代码
if( !function_exists('tf_restrict_access_without_login') ): add_action( 'template_redirect', 'tf_restrict_access_without_login' ); function tf_restrict_access_without_login(){ // 获取当前页面/文章ID $page_id = get_queried_object_id(); // 未登录用户可访问的页面ID白名单 $allowed_pages = [ 95, 5, 141 ]; // 核心条件:用户未登录,且当前页面不在白名单内 if( !is_user_logged_in() && !in_array($page_id, $allowed_pages) ): // 跳转到登录页,注意这里要改成你实际的登录页URL(记得是双斜杠https://) wp_redirect( 'https://example.com/login' ); // 必须加上exit,确保后续代码不再执行 exit; endif; } endif;
关键修改点说明
- 把原数组名
$behind_login_pages改成了更直观的$allowed_pages,方便理解 - 修正了条件判断逻辑:
!is_user_logged_in() && !in_array($page_id, $allowed_pages),精准匹配我们需要的场景 - 调整了
exit;的位置,放在wp_redirect之后(原代码里return之后exit不会执行,这也是可能导致跳转失效的小问题) - 给代码加了中文注释,方便后续维护
额外小提示
- 如果需要添加更多允许访问的页面,直接在
$allowed_pages数组里添加对应的页面ID即可 - 如果你用的是WooCommerce,可以用
get_permalink(get_option('woocommerce_myaccount_page_id'))来动态获取登录页链接,避免硬编码URL失效 - 测试前记得清理网站缓存,避免缓存导致测试结果不准确
备注:内容来源于stack exchange,提问作者Junuk
相关产品推荐
相关产品推荐

