php 自定义query_var重写规则被“page”重写规则中断

ztmd8pv5  于 2023-03-28  发布在  PHP
关注(0)|答案(1)|浏览(88)

我有一个自定义重写规则,似乎被中断。

代码:

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'; // Replace 'custom_pages' with your actual table name
        $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');

问题所在

如果我使用url /drinks/coca-cola,会出现预期的结果:

  • 匹配规则 * 饮料/([a-z]+)[/]?$
  • 匹配查询 * pagename=drink &drink=coca-cola
  • 查询字符串 * pagename=drinks &drink=coca-cola

然后,我获得所需的模板页面,并可以利用数据库查询来动态填充数据。
但是,如果我使用url /drinks/gg4,结果是:

  • 匹配规则 *(.?.+?)(?:/([0-9]+))?/?$
  • 匹配查询 * pagename=drinks%2Fgg4 &page=
  • 查询字符串 * pagename=drinks%2Fgg4

查询甚至没有通过,如QueryMonitor所示

SELECT slug
FROM wp_drink_data
WHERE slug = ''

这就好像,出于某种随机的原因,有什么东西打断了对一些饮料蛞蝓的查询,而不是其他的。我可以输入一个甚至不在数据库中的随机名称作为蛞蝓,它至少会查询DB。
我错在哪里了?我错过了什么?

xfb7svmp

xfb7svmp1#

解决编程总是如此,有时候它是被忽视的最荒谬的事情。

问题出在我的重写规则上。
'drinks/([a-z]+)[/]?$'不允许数字字符和破折号,这就是为什么gg4不能捕获的原因。
将规则更改为以下内容可解决此问题。drinks/([a-zA-Z0-9\-]+)/?$

相关问题