ADD_REWRITE_RULE()与$wp_REWRITE->RULES VS‘REWRITE_RULES_ARRAY’?

时间:2012-05-02 作者:Gregory

我已经为我的自定义帖子类型编写了重写规则。它们工作得很好,只是当重定向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的更新将是一个额外的好机会。

干杯,格雷戈里

1 个回复
最合适的回答,由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;
}

结束

相关推荐