我有一个自定义重写规则,似乎被中断。
代码:
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。
我错在哪里了?我错过了什么?
1条答案
按热度按时间xfb7svmp1#
解决编程总是如此,有时候它是被忽视的最荒谬的事情。
问题出在我的重写规则上。
'drinks/([a-z]+)[/]?$'
不允许数字字符和破折号,这就是为什么gg4
不能捕获的原因。将规则更改为以下内容可解决此问题。
drinks/([a-zA-Z0-9\-]+)/?$