清除自定义$_GET变量的URL

时间:2012-01-05 作者:supertrue

我有一个查询变量show=othertemplate 我可以将其添加到任何URL中,以不同的模板在Wordpress中显示任何帖子、页面或存档,如下所示:mysite.com/[any URL]/?show=othertemplate. 我希望它可以通过干净的URL访问,比如[any URL]/othertemplate[any URL]/show/othertemplate.

我尝试通过向query\\u vars过滤器注册query var并向中添加如下代码来实现这一点。htaccess,但Wordpress介入并抛出了404。WP调试栏显示查询正在查找附件=打印。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/index\\.php
RewriteRule ^(.*)/othertemplate/?$ /index.php/$1?view=othertemplate [L]
我也尝试过使用Wordpress重写函数,但同样的情况也发生了。

function st_myqueryvars($vars) {
    $vars[] = \'show\';
    return $vars;
}

add_filter(\'query_vars\', \'st_myqueryvars\');

function st_myrewriterules( $wp_rewrite ) {
  $newrules = array();
  $new_rules[\'^(.*)/othertemplate/?$\'] = \'index.php/$matches[1]?show=othertemplate\';
  $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_filter(\'generate_rewrite_rules\',\'st_myrewriterules\');
这里有我遗漏的东西吗?

Update: 刷新permalinks后,我看到此WP函数重写了/[any URL]/templateindex.php?show=template 而不是index.php?[the URL\'s corresponding query string]&show=template. 我不能“硬编码”像post\\u type=$匹配项这样的查询字符串(1)(&;名称=$匹配项[2]。。。因为它需要对任何具有不同永久链接结构的页面/帖子/归档文件起作用。我该怎么解决这个问题?

2 个回复
SO网友:MathSmath

您应该看看“重写端点”,这比自定义重写要简单得多。它们非常适合您的用例:http://codex.wordpress.org/Rewrite_API/add_rewrite_endpoint

您可以这样添加“显示”端点:

function wpsx_37961_add_endpoints() {

    // Add the "show" rewrite endpoint to all URLs
    add_rewrite_endpoint(\'show\', EP_ALL);

}
add_action(\'init\',\'wpsx_37961_add_endpoints\');
然后,您可以在WP操作上检查其值(或者更早,我不确定),例如:

function wpsx_37961_check_endpoint() {

    $show = $wp_query->get( \'show\' );

    // Now, do whatever template switching you want based on the $show var\'s value

}
add_action(\'wp\',\'wpsx_37961_check_endpoint\');
实际切换模板的工作由您决定,但这将使您的端点就位。没有过滤查询变量,没有将重写规则拼凑在一起,没有困难:)

SO网友:Brian Fegter

查看我的帖子here. 这应该会对你有所帮助。你在正确的轨道上。添加重写规则后,请记住通过访问设置->永久链接刷新永久链接

结束

相关推荐