如何使用slug结合wp_redirect()实现用户重定向?解决带参数插件页面的重定向失效问题
解决WP后台插件页面的重定向问题
先直接回答你的两个问题,再给出修正后的完整代码:
问题1:如何正确判断当前页面为/wp-admin/admin.php?page=booknetic?
因为这是WordPress后台的插件页面,不能用前台的is_page()这类函数来判断,正确的判断逻辑应该是:
- 先用
is_admin()确认当前处于WP后台环境 - 再检查
$_GET['page']是否存在且等于booknetic(因为该页面的URL参数里page的值就是这个)
注意一定要加isset($_GET['page']),避免出现PHP未定义索引的警告。
问题2:重定向失效是否因为该页面是自定义链接指向的插件页面?
不是,自定义链接只是该插件页面的入口,本身不会导致重定向失效。真正的问题出在你原来代码的逻辑运算符优先级错误,以及页面判断的逻辑混乱:
你原来的条件写法是:
if ( is_front_page() || isset($_GET['page']) || is_page('profile') || is_page('account') && is_user_logged_in() && $count == 0)
由于&&的优先级高于||,这段代码实际的执行逻辑是:is_front_page() || isset($_GET['page']) || is_page('profile') || (is_page('account') && is_user_logged_in() && $count == 0)
这意味着:只要是首页、任何带page参数的页面、profile页面,不管用户是否登录或是否填过表单,都会被重定向;只有account页面才会检查登录状态和表单提交情况——这完全不符合你的需求。
另外,template_redirect钩子虽然在后台也会触发,但针对后台页面,配合admin_init钩子一起使用会更稳妥。
修正后的完整代码
下面的代码会同时处理前台和后台页面,逻辑清晰且避免了优先级问题:
// 重定向已登录未填表单的用户到申请表单页面 add_action( 'template_redirect', 'redirect_to_application_form' ); add_action( 'admin_init', 'redirect_to_application_form' ); // 确保后台页面也能触发 function redirect_to_application_form() { // 声明全局变量$count(确保能正确获取表单提交记录数) global $count; // 先排除不需要重定向的情况:未登录 或 已填表单 if ( !is_user_logged_in() || $count !== 0 ) { return; } // 判断当前是否是需要重定向的页面 $needs_redirect = false; // 前台页面判断 if ( is_front_page() || is_page('profile') || is_page('account') ) { $needs_redirect = true; } // 后台插件页面判断 if ( is_admin() && isset($_GET['page']) && $_GET['page'] === 'booknetic' ) { $needs_redirect = true; } // 执行重定向 if ( $needs_redirect ) { // 使用home_url生成绝对路径,避免后台环境下相对路径出错 wp_redirect( home_url('/first-time-application-temp/') ); exit; // 必须加exit终止后续代码执行 } }
额外注意事项
- 确保
$count变量确实能准确反映用户的表单提交状态,比如当用户未提交表单时$count严格等于0 - 如果后台重定向仍然不生效,可以尝试提高钩子的优先级,比如把
add_action的第三个参数设为1(让代码更早执行):add_action( 'admin_init', 'redirect_to_application_form', 1 ); - 调试时可以在函数里添加日志记录,确认页面是否被正确识别:
日志会出现在WP根目录的error_log( 'Current request URI: ' . $_SERVER['REQUEST_URI'] );wp-content/debug.log(需要开启WP_DEBUG)
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

