重写自定义WP_QUERY结果的URL

时间:2016-09-23 作者:benoît

我有以下表格:

<form action="<?php the permalink(); ?>" method="get" >
<input type="hidden" name="taxo" value="question" />
<select name = "cata">
  <option value=\'unique_name-a\'>xxx</option>
  <option value=\'foo\'>yyy</option>
  <option value=\'bar\'>zzz</option>
</select>
<select name ="catb">
  <option value=\'unique_name-d\'>xxx</option>
  <option value=\'unique_name-e\'>yyy</option>
  <option value=\'unique_name-f\'>zzz</option>
</select>
<!-- and more select -->
<button>send</button>
</form>
以及模板页面中的此查询:

$query = new WP_Query( array(
  \'post_type\' =>  \'page\',
  \'tax_query\' => array(                   
    \'relation\' => \'AND\',                     
      array(
        \'taxonomy\' => \'question\',   // from $_GET[\'taxo\']            
        \'field\' => \'slug\',                   
        \'terms\' => array(\'unique_name-a\',\'unique_name-e\',\'more\'), // from my submit form   
        \'include_children\' => false,          
        \'operator\' => \'AND\'                    
      ),
  )
) );
我想玩URL重写。我有这样的想法:

http://example.com/?taxo=question&cata=foo&catb=bar&catc=more
我希望上述查询的重写URL为:

http://example.com/questions/cata/foo/catb/bar/catc/…/
编辑:为什么此功能不工作?

  function custom_rewrite() {
       add_rewrite_rule(
        \'question-tax/test/4/\',
        \'index.php?tax=question&test=4\',
        \'top\'
        );

      }
      // refresh/flush permalinks in the dashboard if this is changed in any way
      add_action( \'init\', \'custom_rewrite\' ); 

2 个回复
最合适的回答,由SO网友:Spartacus 整理而成

您可以尝试使用add_rewrite_endpoint 函数,它实际上可以让您避免任何htaccess修改(除非您需要$\\u GET)。

示例:

function add_custom_rewrite_ep() {
    add_rewrite_endpoint(\'cata\', EP_PAGES);
    add_rewrite_endpoint(\'catb\', EP_PAGES);
    add_rewrite_endpoint(\'catc\', EP_PAGES);
}
add_action( \'init\', \'add_custom_rewrite_ep\' );

Make sure you flush your rewrite rules.

那么,如果您的URL是/questions/cata/foo/catb/bar/catc/more/, 您可以使用访问值get_query_var 像这样:

$x = get_query_var(\'cata\',\'default\'); // equals \'foo\'
$y = get_query_var(\'catb\',\'default\'); // equals \'bar\'
$z = get_query_var(\'catc\',\'default\'); // equals \'more\'
如果使用$\\u GET global以及如何使用代码中的值,在不知道url是如何生成的情况下,很难给出精确的解决方案。

SO网友:Ethan O\'Sullivan

以下是我的方法RewriteRule.htaccess 而不是使用add_rewrite_rule() 功能:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} ^taxo=([^&]+)&([^=]+)=([^&]+)&([^=]+)=([^&]+)&([^=]+)=(.*)$
RewriteRule ^/?$ /%1/%2/%3/%4/%5/%6/%7? [L,R=301]
</IfModule>
已使用htaccess tester.

两者之间的区别Spartacus\' 答案是,如果查询字符串?taxo= 在它开始重写规则之前。而且,我的重写不仅限于cata, catb, 和catc 您正在使用它作为示例。此规则动态地覆盖所有其他slug,以防分类法值发生更改。例如:

http://example.com/?taxo=question&cata=foo&catb=bar&catc=more
http://example.com/?taxo=answer&type=foo&id=123&date=123
将成为:

http://example.com/question/cata/foo/catb/bar/catc/more
http://example.com/answer/type/foo/id/123/date/123

相关推荐

Force pretty permalinks?

我正在构建一个插件,该插件将用于单个站点,并依赖于add_rewrite_rule 要工作,需要打开永久链接。打开它们并不困难,因为它只是一个站点,但我担心其中一个管理员可能会在不知道自己在做什么的情况下关闭它,并破坏该站点。如何以编程方式强制保持漂亮的永久链接?