自定义Rewrite Rule被'page'规则干扰,部分URL匹配异常求助
问题
配置WordPress自定义Rewrite规则后,部分URL匹配异常,仅部分slug能正常触发规则。
代码实现
class drinks { public function drink_rewrite_rule() { add_rewrite_rule( 'drinks/([a-z]+)[/]?$', 'index.php?pagename=drinks&drink=$matches[1]', 'top' ); } public function query_drink($urlslug) { global $wpdb; $table_name = $wpdb->prefix . 'drink_data'; $slug = $wpdb->get_var( $wpdb->prepare( "SELECT slug FROM $table_name WHERE slug = %s", $urlslug ) ); return $slug; } } $init = new drinks(); add_action('init', [$init, 'drink_rewrite_rule']); add_filter('query_vars', function ( $query_vars ){ $query_vars[] = 'drink'; return $query_vars; } ); function test() { $slug = get_query_var( 'drink' ); $clean_slug = sanitize_title($slug); $class = new drinks(); if ( get_query_var( 'drink' ) == false || get_query_var( 'drink' ) == '' ) { return $template; } if ( !$class->query_drink($clean_slug)) { global $wp_query; $wp_query->set_404(); status_header( 404 ); } return get_template_directory() . '/resources/page-templates/' . 'drink.php'; } add_action( 'template_include', 'test');
异常现象
- 访问
/drinks/coca-cola时正常:匹配自定义规则,drink参数正确传递,能加载指定模板并查询数据库。 - 访问
/drinks/gg4时异常:匹配WordPress默认规则(.?.+?)(?:/([0-9]+))?/?$,pagename被解析为drinks/gg4,drink参数为空,数据库查询时slug值为空。
问题原因及修复方案
1. Rewrite规则正则范围过窄
自定义规则的正则drinks/([a-z]+)[/]?$仅匹配纯小写字母,而像gg4这类包含数字的slug不符合匹配条件,因此触发了默认规则。
修复:
修改正则表达式,支持字母、数字、连字符(覆盖常见slug格式):
add_rewrite_rule( 'drinks/([a-z0-9-]+)[/]?$', // 扩展匹配范围 'index.php?pagename=drinks&drink=$matches[1]', 'top' );
2. 未刷新Rewrite规则缓存
添加或修改自定义规则后,必须刷新WordPress的Rewrite规则缓存,否则新规则不会生效。
操作:
进入WordPress后台 → 设置 → 固定链接,无需修改任何选项,直接点击「保存更改」即可完成缓存刷新。
3. template_include使用错误
template_include是WordPress的过滤器(filter),而非动作(action),原代码用add_action会导致$template变量未定义,逻辑异常。
修复后的模板函数:
function test( $template ) { // 接收默认模板参数 $slug = get_query_var( 'drink' ); $clean_slug = sanitize_title($slug); if ( empty($slug) ) { // 简化空值判断 return $template; } if ( !drinks::query_drink($clean_slug)) { global $wp_query; $wp_query->set_404(); status_header( 404 ); return get_404_template(); // 明确返回404模板 } return get_template_directory() . '/resources/page-templates/drink.php'; } add_filter( 'template_include', 'test'); // 改用add_filter
4. 优化类实例化
原代码在test()中重复实例化drinks类,可将查询方法改为静态方法简化调用:
// 修改类中的方法为静态 class drinks { public static function query_drink($urlslug) { global $wpdb; $table_name = $wpdb->prefix . 'drink_data'; $slug = $wpdb->get_var( $wpdb->prepare( "SELECT slug FROM $table_name WHERE slug = %s", $urlslug ) ); return $slug; } } // 模板函数中直接调用静态方法 if ( !drinks::query_drink($clean_slug)) { // ... }
内容的提问来源于stack exchange,提问作者CoochieCook
相关产品推荐
相关产品推荐

