重写规则中有多个值,可能吗?

时间:2016-05-30 作者:Roy

我正在为我正在构建的过滤器使用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结构?

1 个回复
最合适的回答,由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 将中断查询,因此可能可以使用不太常用的分隔符。

相关推荐