重写API不会重定向-它只是将URL结构“映射”到查询字符串-您需要自己进行重定向。
首先,修复重写规则:
\'episode/([^/]+)/transcript\'; // Matches anything that follows transcript, not what we want!
\'episode/([^/]+)/transcript/?$\'; // Matches only "episode/name/transcript", optionally with a trailing slash
现在引入一个助手函数:
/**
* Get transcript URL.
*
* @param int $post_id
* @return string
*/
function wpse_180990_get_transcript_url( $post_id ) {
return trailingslashit( get_permalink( $post_id ) ) . user_trailingslashit( \'transcript\' );
}
并执行重定向:
/**
* Force "episode/postname/2" to canonicalize as "episode/postname/transcript".
*/
function wpse_180990_redirect_transcript() {
global $wp;
if ( is_singular( \'episodes\' ) && get_query_var( \'page\' ) === 2 && $wp->matched_rule !== \'episode/([^/]+)/transcript/?$\' ) {
$url = wpse_180990_get_transcript_url( get_queried_object_id() );
wp_redirect( $url );
exit;
}
}
add_action( \'template_redirect\', \'wpse_180990_redirect_transcript\' );
如果是一集的第2页,但我们的自定义重写不是请求URI,请将它们发送到
/transcript
.
现在来解决你现在遇到的重定向问题(/transcript
到/2
). WordPress有一个方便的功能redirect_canonical()
, 它试图使所有请求尽可能保持“单一”(规范)。问题是,有时聪明是为了自己好。
在您的情况下,它检测到相同的条件为真(单集第2页),但只是认为当前请求是“错误”的请求,并重定向到“正确”的请求。
让我们告诉它不要这样做:
/**
* Override {@see redirect_canonical()}.
*
* @see wpse_180990_force_transcript()
*
* @param string $url
* @return string
*/
function wpse_180990_transcript_canonical( $url ) {
if ( is_singular( \'episodes\' ) && get_query_var( \'page\' ) === 2 )
$url = wpse_180990_get_transcript_url( get_queried_object_id() );
return $url;
}
add_filter( \'redirect_canonical\', \'wpse_180990_transcript_canonical\' );