劫持URL进行过滤

时间:2011-05-10 作者:Ben Everard

好吧,交易是这样的。我有一个显示新闻帖子的循环,这些帖子可以属于特殊类别(不是普通类别),我希望能够根据它们进行过滤。

如果我对美学不太感兴趣,我会使用这样的链接:

domain.com/news?filter=cat1
但我想做的是(»重写):

domain.com/news/cat1 » domain.com/news/?filter=cat1
我修改了.htaccess 通过cat1 值作为GET变量:

RewriteEngine On
RewriteBase /
RewriteRule ^news/(.*)/$ /news/?filter=$1 [L,QSA]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
问题是,即使现在已成功通过filter 变量,WordPress处理/cat1/ 作为一个页面,它显然找不到它,因此抛出404。

有没有一种方法可以允许在不触发404的情况下重写这个特定的URL?它似乎在地址栏中获取URL并进行解析,我真正想要的是它解析重写的URL。

谢谢

1 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

WordPress也有重写机制,最好使用它,而不是在.htaccess 文件

您可以向其中添加自己的重写规则。在您的情况下,我们要存储cat1 这是一个单独的查询变量的一部分,因此我们还需要告诉WordPress允许这个查询变量(为了安全起见,它使用了一个白名单)。

重写规则的精确形式取决于http://domain.com/news/ is:是带有自定义模板的页面还是其他页面?你应该发现这一点(使用我的Rewrite analyzer plugin 例如),并将其添加到重写规则中。

add_action( \'init\', \'wpse16819_init\' );
function wpse16819_init()
{
    // Base form, will probably not work because it does nothing with the `news` part
    add_rewrite_rule( \'news/([^/]+)/?$\', \'index.php?wpse16819_filter=$matches[1]\', \'top\' );
    // Use this instead if `news` is a page
    add_rewrite_rule( \'news/([^/]+)/?$\', \'index.php?wpse16819_filter=$matches[1]&pagename=news\', \'top\' );
}

add_filter( \'query_vars\', \'wpse16819_query_vars\' );
function wpse16819_query_vars( $query_vars )
{
    $query_vars[] = \'wpse16819_filter\';
    return $query_vars;
}
添加此代码后,请记住刷新重写规则(将其保存到数据库)。您可以通过访问管理区域中的Permalinks页面来完成此操作。

您现在可以访问wpse16819_filter 变量为get_query_var( \'wpse16819_filter\' );.

结束