将第/2页更改为/Transcript,并重写

时间:2015-03-12 作者:Sarah

我设置了这个规则(在functions.php中)

function custom_rewrite_basic() {
    add_rewrite_rule(
      \'episode/([^/]+)/transcript\', 
      \'index.php?post_type=episodes&episodes=$matches[1]&page=2\', 
      \'top\');
}
add_action(\'init\', \'custom_rewrite_basic\');
希望它重定向www.domain。com公司/episode/postname/2/ 转到www.domain。com公司/episode/postname/transcript/ 但它仍将是/2/。

有趣的是,如果我输入www.domain。com公司/episode/postname/transcript/ 它仍然有效,但会重定向到/2/。

我已经安装了重写分析器插件,它没有给我任何错误。。。我的帖子类型是“集”,slug/url是“集”

谁能给我指点路吗?永远感激。。。莎拉

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

重写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\' );

结束

相关推荐

Get paged outside of loop?

是否可以在标准WP循环之外进行寻呼?我已经在循环中使用了:<?php if ( $paged >= 2 ) { ?> Some text for the 2nd page on up <?php } ?> 但我希望能够在第二页或更大的所有页面上,在循环之外回显一些文本。可能的还是更好的方法?