给隐藏入口加了权限判断,退出登录后直接访问那个地址,页面内容照样完整显示出来,等于白加。乍看像缓存或者权限的锅,追下去往往不是。

add_action('template_redirect', function () {
  if (current_user_can('read_private_posts')) return;
  wp_safe_redirect(wp_login_url(get_permalink()));
  exit;
});

追下去是这么回事:判断挂在用户还没加载的早期钩子上,函数拿到的是空用户,或者判断为假之后没有退出继续往下跑,后面的代码照样执行。

「current_user_can 返回 true」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

具体做法是,把权限判断挪到模板重定向这个钩子上再执行;判断为假的时候直接终止请求或者跳到登录页;把后台 ajax 与前台请求分开,各自走自己的判断逻辑。

验收就看一点,退出登录后访问该地址被跳到登录页,登录后内容正常显示,不再泄露。

作者 9823189