You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:02:47