web-dev-qa-db-ja.com

書き換えでpage/2を/ transcriptに変更

私は(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/transcript/にwww.domain.com/episode/postname/2/をリダイレクトすることを期待していますそれでもまだ/ 2 /になるでしょう。

おもしろいことに、私がwww.domain.com/episode/postname/transcript/とタイプしてもそれでもうまくいくが、/ 2 /にリダイレクトする。

Rewrite Analyzerプラグインをインストールしましたが、エラーが発生しません。投稿タイプは "episodes"、スラッグ/ URLは "episode"です。

誰かが私を案内してくれる?永遠に感謝します...サラ

3
Sarah

書き換え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' );
4
TheDeadMedic