WordPress Block插件add_rewrite_rule重写规则失效排查
问题解决步骤
1. 修复重写规则的正则匹配漏洞
你当前的重写规则正则[a-z0-9-]+未包含下划线_,但你的slug格式(比如02-12-2024_artist_name)带有下划线,导致规则无法匹配目标URL,直接返回404。修改正则为包含下划线的模式:
add_action('init', function () { // 新增下划线匹配,调整正则为[a-z0-9-_]+ add_rewrite_rule('event/([a-z0-9-_]+)[/]?$', 'index.php?slug=$matches[1]', 'top'); add_rewrite_tag('%slug%', '([^&]+)'); error_log("Rewrite rules added"); }); add_filter('query_vars', function ($query_vars) { $query_vars[] = 'slug'; return $query_vars; });
2. 刷新WordPress固定链接缓存
添加或修改重写规则后,必须刷新固定链接才能让规则生效:
- 登录WordPress后台,进入「设置」→「固定链接」
- 无需修改任何设置,直接点击「保存更改」,这会触发WordPress更新重写规则缓存。
3. 修正template_include钩子逻辑
你当前的钩子逻辑完全倒置:应该在slug存在且有效时返回自定义模板render.php,而非默认模板。另外,原代码在slug存在时无返回值,会导致WordPress无法正确加载模板。修改后的代码:
add_filter('template_include', function ($template) { $slug = get_query_var('slug', false); // 当slug存在且不为空时,加载自定义模板 if ($slug && !empty($slug)) { $custom_template = plugin_dir_path(__FILE__) . 'src/render.php'; // 先检查模板文件是否存在,避免报错 if (file_exists($custom_template)) { return $custom_template; } } // 否则返回默认模板 return $template; });
4. 在render.php中获取slug
在render.php里,直接通过get_query_var('slug')获取当前slug值,用于渲染活动详情:
$event_slug = get_query_var('slug'); // 此处根据slug查询活动数据并渲染内容
额外检查项
- 确保服务器支持URL重写:Apache需开启
mod_rewrite模块;Nginx需在配置文件中添加以下规则:
location / { try_files $uri $uri/ /index.php?$args; }
- 开启
WP_DEBUG查看wp-content/debug.log,排查是否存在插件或主题冲突导致的错误。
内容的提问来源于stack exchange,提问作者Michael Benker
相关产品推荐
相关产品推荐

