我已经为我的自定义帖子类型编写了重写规则。它们工作得很好,只是当重定向url与请求的url不匹配时,WP不会更新用户代理中的url。
尽管包括我的自定义permastructs(“post\\u type\\u link”)和自定义模板选项(“single-template”),其他一切都很好。
我的规则:
// custom URL rewrite for Album posts
add_action( \'init\', \'gregory_rewrite_album_link\' );
function gregory_rewrite_album_link()
{
// album--%album_slug%/ OR album/%album_slug%/
// preferred permastruct: album--%album_slug%/
add_rewrite_rule(
\'^album(/|--)([^/]+)/?$\',
\'index.php?post_type=gregory-cpt-album&name=$matches[2]\',
\'top\' );
}
// custom URL rewrite for Track posts
add_action( \'init\', \'gregory_rewrite_track_link\' );
function gregory_rewrite_track_link()
{
// accepts and rewrites the following permutations:
// where album would be: album--%album_slug% OR album/%album_slug%
// where track would be: track--%track_slug% OR track/%track_slug%
// preferred permastruct: album--%album_slug%/track--%track_slug%/
add_rewrite_rule(
\'^(album(/|--)[^/]+/)?track(/|--)([^/]+)/?$\',
\'index.php?post_type=gregory-cpt-track&name=$matches[4]\',
\'top\' );
}
我想知道使用add\\u rewrite\\u rule()、将规则直接附加到$wp\\u rewrite->rules和挂接到rewrite\\u rules\\u数组之间的区别是什么?有什么不同吗?当目标帖子的永久链接与请求的url不同时,是否有一种替代方法会强制WP更新用户代理中的url?
url未更新的一个示例。。。专辑和曲目帖子通过相互的分类术语进行链接。曲目的“post\\u type\\u link”挂钩会找到链接的相册,并将其slug插入永久链接。上面的重写规则确保了新的和传统的Permastruct都可以工作,但是请求这个url/album/serenity/track--beetle-attack/
将找到帖子,但不会将url更新为/album--serenity/track--beetle-attack/
.
不太可能有人会使用传统的permastructs,因为我不会在我的网站上发布或使用它们,但如果可能的话,在用户代理中看到url的更新将是一个额外的好机会。
干杯,格雷戈里
最合适的回答,由SO网友:Stephen Harris 整理而成
首先使用add_rewrite_rule()
过度直接干扰$wp_rewrite->rules
如果可能的话。后者有点低级。
关于“url未更新”-这不是重写规则的工作。它们只是将URL指向其内容,但不会更新用户的地址栏。
负责此操作的文件是/wp-includes/canonical.php. 尤其是功能redirect_canonical()
钩住template_redirect
.
这redirect_canonical()
有自己的筛选器:
add_filter(\'redirect_canonical\', \'wpse50912_redirect_canonical\',10,2)
function wpse50912_redirect_canonical($redirect_url, $requested_url){
//Do stuff - determine if url is requesting album/track and check
//If it is, check it is using the new structure.
//Return the url you want in the address bar.
return $redirect_url;
}