WordPress custom_rewrite_rule()失效问题求助
问题排查与解决方案
核心问题分析
你遇到的问题根源有三个:
- URL与重写规则不匹配:你的重写规则匹配的是
^profile/([^/]+)/(\d+)/?(即Website.com/profile/Poul/21),但你实际访问的是Website.com/page/Poul/21,规则根本没有触发,导致WordPress解析到错误的变量值。 - 未注册自定义查询变量:WordPress默认不会识别
name和age这类自定义查询参数,直接使用get_query_var可能无法正确获取值。 - 错误的规则刷新时机:将
flush_rewrite_rules()放在init钩子中会导致每次页面加载都刷新规则,不仅影响性能,还可能引发规则冲突。
修复步骤与代码调整
- 修正重写规则匹配模式:根据你的访问URL需求,将规则改为匹配
page/开头的路径;或者保持原规则,访问Website.com/profile/Poul/21。 - 注册自定义查询变量:通过
query_vars钩子告诉WordPress允许使用name和age参数。 - 调整规则刷新时机:仅在主题激活时刷新规则,避免重复执行。
修改后的完整代码如下:
// 注册自定义查询变量 function custom_query_vars($vars) { $vars[] = 'name'; $vars[] = 'age'; return $vars; } add_filter('query_vars', 'custom_query_vars'); // 添加重写规则(根据你的URL需求二选一) function custom_rewrite_rule() { // 选项1:匹配 page/xxx/xx 格式的URL add_rewrite_rule('^page/([^/]+)/(\d+)/?', 'index.php?page_id=104&name=$matches[1]&age=$matches[2]', 'top'); // 选项2:匹配 profile/xxx/xx 格式的URL(原规则) // add_rewrite_rule('^profile/([^/]+)/(\d+)/?', 'index.php?page_id=104&name=$matches[1]&age=$matches[2]', 'top'); } add_action('init', 'custom_rewrite_rule'); // 主题激活时刷新重写规则 function custom_flush_rewrite_rules() { custom_rewrite_rule(); flush_rewrite_rules(); } add_action('after_switch_theme', 'custom_flush_rewrite_rules'); // 短码回调函数 function display_profile_content() { $name = sanitize_text_field(get_query_var('name')); $age = intval(get_query_var('age')); echo 'Name: ' . $name . '<br>'; echo 'Age: ' . $age . '<br>'; } add_shortcode('profile_content', 'display_profile_content');
验证操作
- 将上述代码替换原
functions.php中的对应内容并保存。 - 登录WordPress后台,进入设置→固定链接页面,无需修改任何设置,直接点击「保存更改」按钮,手动刷新重写规则。
- 根据你选择的规则选项,访问对应的URL:
- 若选选项1:访问
Website.com/page/Poul/21 - 若选选项2:访问
Website.com/profile/Poul/21
- 若选选项1:访问
此时页面应正确显示:
Name: Poul
Age: 21
内容的提问来源于stack exchange,提问作者Stefano
相关产品推荐
相关产品推荐

