使用WordPress灵活重写“漫游”URL

时间:2012-04-10 作者:Frank Nocke

我想访问id为17的帖子,如下所示:

http://localhost/archives/17/moot-bla-foo-ramble

换言之,id应该决定,之后的一切可能是(也可能不是)鼻涕虫或其他任何东西。很像这些指向同一页面的链接(许多其他网站也这样做):

我试图在我的顶部定义这样的重写规则。htaccess:

RewriteRule ^archives/(\\d{1,12})(?:/.*) archives/$1 [NC]
这几乎起作用,即转到正确的页面,但找不到我的页面,因为wordpress再次查看PATH\\u信息(我想)并声明$query_string 现在是string attachment=moot-bla-foo-ramble

我不想做301重定向。

如果Permalink设置中存在这样的东西,我最喜欢的或当然是:自定义结构

/archives/%post_id%/%wildcard%
虽然这会使“漫游”成为强制性的,所以更好。。。

/archives/%post_id%(/%wildcard%)?
我想是一厢情愿吧。

3 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

您不应该使用htaccess,而应该使用WordPress API

e、 g。

function custom_rewrite( $wp_rewrite ) {

    $feed_rules = array(
        \'archives/(\\d+)(?:/.*)+\'    =>  \'index.php?p=\'. $wp_rewrite->preg_index(1)
);

    // ( array merge must be done this way, to ensure new rule comes first )
    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( \'generate_rewrite_rules\', \'custom_rewrite\' );

SO网友:Stephen Harris

本质上与@Tom的答案相同,但使用提供的add_rewrite_rule 包装器:

add_action(\'init\',\'wpse48481_rewrite_rules\');
function wpse48481_rewrite_rules(){
    add_rewrite_rule(\'^archives/([0-9]{1,})/\',\'index.php?p=$matches[1]\',\'top\');
}
这将检查表单的URL:

 http://www.yoursite.com/archives/99/something-else
并将其解释为ID为99的post/page/cpt。当然正则表达式可以是你喜欢的任何东西。。。

SO网友:Frank Nocke

我很抱歉,但这一切都给我带来了难以忍受的麻烦。突然,标签和分类URL停止工作,出现了一个“这很尴尬”的空搜索页面。。。

即使是由flush触发的、不添加任何规则的中立的、不变的回调也会破坏诸如*/归档文件/标签/奇异值*/归档文件/类别/水果之类的东西

全部删除并保存/wp admin/options permalink。php(即数字设置)再次修复了它。反复地非常可靠。另请参见this thread 在wordpress。组织。

基本上,花了一天的时间,我想出了一个非常简单的方法,看起来很有效。将此添加到中。htacces,在wordpress块之前

RewriteRule ^archives/(\\d{1,12})(?:/.*) archives/$1 [NC,L]
将此添加到我的主题函数中。php。直接地没有挂钩。

if ( isset($_SERVER["REDIRECT_URL"]) )
    $_SERVER["REQUEST_URI"] = $_SERVER["REDIRECT_URL"];
是的,非常脏,正在写入$\\u服务器变量。瞧,我所有的测试用例都能正常工作(简单url、随意附加的url、标记、类别……)(注意:如果您的起始页停止工作,则没有此选项(永无止境的重定向循环)

结束

相关推荐

Page Name and Permalinks

我正在使用WordPress 3.2.1,刚刚在我的网站上添加了一个名为“中心管理”的页面,这反过来又创建了一个永久链接:http://localhost:8888/mysite/centre-management/对于我刚刚创建的页面。之后,我把这个页面弄得一团糟,想重新开始。因此,当我现在创建另一个与上述名称相同的新页面时,即“中心管理”,WordPress现在为我创建一个永久链接:‎http://localhost:8888/mysite/centre-管理-2/这不是我想要的。我希望它显示为:ht