我有以下表格:
<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\' );
最合适的回答,由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