多查询变量排序组合和URL重写

时间:2016-03-03 作者:PauGNU

我有一个自定义帖子类型(“程序”)的自定义搜索页面。可以为此搜索设置4个参数:“word\\u search”、“archived”、“category”和“operating\\u system”。

我们可以按“word\\u search”和“category”,或“operating\\u system”和“archived”,或仅按“operating\\u system”或3或任意组合进行搜索。这将生成以下类型的URL:

如果某个参数未用于筛选,则它不会出现在最终url中。例如,如果我们不使用word\\u search或归档参数,url将如下所示:

这很好用。现在我想应用一个重写规则,比如URL:

  • http://example.com/program/w/$1/os/$2/cat/$3/arch/$4以及所有可能的组合,考虑到某些参数可能不会使用。即:

    • http://example.com/program/w/$1//li>
    • http://example.com/program/os/$1/猫/2美元http://example.com/program/w/$1美元/操作系统/2美元/拱门/3美元。。。依此类推,为了实现这一点,我可以添加一个重写规则(add\\u rewrite\\u rules),但我不知道如何创建“通用”url。如果我只有“category”参数,我可以创建如下重写规则:

      array(\'programs/cat/([^/]+)/?\' => \'index.php?post_type=program&category=$matches[1]\');
      
      但当我必须组合2个或更多参数时,这就开始变得复杂,因为我必须为每个组合创建一条线。这意味着:

      array(\'programs/cat/([^/]+)/arc/([^/]+)?\' => \'index.php?post_type=program&category=$matches[1]&archived=$matches[2]\');
      array(\'programs/cat/([^/]+)/os/([^/]+)?\' => \'index.php?post_type=program&category=$matches[1]&os=$matches[2]\');
      array(\'programs/cat/([^/]+)/w/([^/]+)?\' => \'index.php?post_type=program&category=$matches[1]&word_search=$matches[2]\');
      
      其他组合也是如此。我该怎么做才能避免编写所有的重写规则?

      谢谢

1 个回复
SO网友:PauGNU

好吧,我在这里解释我最终做了什么来解决这个问题。我还没有找到合适的方法,但是:

我创建了一个重写函数,用于检索所有参数并生成最终URL,其中的参数按特定方式排序。

function sc_change_programs_search_url_rewrite() {
    if(get_query_var( \'post_type\' ) == \'program\') {
        if(isset($_GET[\'word_search\']) || isset($_GET[\'os\']) || isset($_GET[\'category\']) || isset($_GET[\'archived\'])) {
            $available_query_vars = array( \'word_search\' => \'p\', \'sistema_operatiu\' => \'so\', \'category\' => \'cat\', \'archived\' => \'archived\' );
            $params_query = \'\';
            foreach($available_query_vars as $query_var => $key) {
                if (get_query_var( $query_var )) {
                    if($query_var == \'archived\') {
                        $params_query .= $key . \'/\';
                    } else {
                        $params_query .= $key . \'/\' . get_query_var( $query_var ) . \'/\';
                    }

                }
            }

            if( ! empty( $params_query ) ) {
                wp_redirect( home_url( "/programs/" ) . $params_query );
            }
        }
    }
}
我创建了所有重写规则(考虑到顺序只能是一个,要实现的规则更少,但还是有很多):

$aNewRules = array(
    \'programes/p/([^/]+)/so/([^/]+)/cat/([^/]+)/arxivats/?\' => \'index.php?post_type=programa&cerca=$matches[1]&sistema_operatiu=$matches[2]&categoria_programa=$matches[3]&arxivat=1\',
    \'programes/p/([^/]+)/so/([^/]+)/cat/([^/]+)/?\' => \'index.php?post_type=programa&cerca=$matches[1]&sistema_operatiu=$matches[2]&categoria_programa=$matches[3]&arxivat=0\',
    \'programes/p/([^/]+)/so/([^/]+)/arxivats/?\' => \'index.php?post_type=programa&cerca=$matches[1]&sistema_operatiu=$matches[2]&arxivat=1\',
    \'programes/p/([^/]+)/cat/([^/]+)/arxivats/?\' => \'index.php?post_type=programa&cerca=$matches[1]&categoria_programa=$matches[2]&arxivat=1\',
    \'programes/p/([^/]+)/so/([^/]+)/?\' => \'index.php?post_type=programa&cerca=$matches[1]&sistema_operatiu=$matches[2]&arxivat=0\',
    \'programes/p/([^/]+)/cat/([^/]+)/?\' => \'index.php?post_type=programa&cerca=$matches[1]&categoria_programa=$matches[2]&arxivat=0\',
    \'programes/p/([^/]+)/arxivats/?\' => \'index.php?post_type=programa&cerca=$matches[1]&arxivat=1\',
    \'programes/p/([^/]+)/?\' => \'index.php?post_type=programa&cerca=$matches[1]&arxivat=0\',
    \'programes/so/([^/]+)/cat/([^/]+)/arxivats/?\' => \'index.php?post_type=programa&sistema_operatiu=$matches[1]&categoria_programa=$matches[2]&arxivat=1\',
    \'programes/so/([^/]+)/arxivats/?\' => \'index.php?post_type=programa&sistema_operatiu=$matches[1]&arxivat=1\',
    \'programes/so/([^/]+)/cat/([^/]+)/?\' => \'index.php?post_type=programa&sistema_operatiu=$matches[1]&categoria_programa=$matches[2]&arxivat=0\',
    \'programes/so/([^/]+)/?\' => \'index.php?post_type=programa&sistema_operatiu=$matches[1]\',
    \'programes/cat/([^/]+)/arxivats/?\' => \'index.php?post_type=programa&categoria_programa=$matches[1]&arxivat=1\',
    \'programes/cat/([^/]+)/?\' => \'index.php?post_type=programa&categoria_programa=$matches[1]\',
    \'programes/arxivats/?\' => \'index.php?post_type=programa&arxivat=1\',
);
$aRules = $aNewRules + $aRules;
return $aRules;
仍然希望有更好的解决方案。。。

相关推荐