我正在为我正在构建的过滤器使用url重写。当前解决方案适用于一个选定值。因此,如果我选择一种类型的菜,比如晚餐,它会转到/食谱/晚餐/。
但如果我想在晚餐和午餐时过滤呢?使用add\\u rewrite\\u规则,这是否可行?
目前的解决方案如下。
add_filter( \'query_vars\', function( $vars ) {
$vars[] = \'course\';
return $vars;
} );
add_action( \'init\', function() {
add_rewrite_tag( \'%course%\', \'([^&]+)\' );
}, 10, 0 );
add_action( \'init\', function() {
add_rewrite_rule( \'^recipes/([^/]*)/?\', \'index.php?page_id=11&course=$matches[1]\', \'top\' );
}, 10, 0 );
如果可能的话,遵循什么样的逻辑url结构?
最合适的回答,由SO网友:gmazzap 整理而成
据我所知,你知道我们可以有一个像example.com/recipes/dinner/
或example.com/recipes/lunch/
但现在您还需要一个URL,如example.com/recipes/dinner-lunch/
这吸引了来自“晚餐”和“午餐”课程的帖子。
在WP重写的当前状态下,仅使用add_rewrite_rule
但你也需要使用pre_get_posts
根据重写规则捕获的值编辑查询。
例如:
add_filter(\'query_vars\', function($vars) {
$vars[] = \'course\';
return $vars;
} );
add_action(\'init\', function() {
add_rewrite_rule(\'^recipes/([^/]*)/?\', \'index.php?page_id=11&course=$matches[1]\', \'top\');
}, 10, 0);
add_action(\'pre_get_posts\', function($query) {
if (! is_admin() && $query->is_main_query() && $query->get(\'course\')) {
// explode the value of matched course by -
$courses = explode(\'-\', $query->get(\'course\'));
// update the value in query with an array
$query->set(\'course\', $courses);
}
});
这里的问题是,如果“课程”的名称中有连字符,则
explode
将中断查询,因此可能可以使用不太常用的分隔符。