Измените страницу /2 на /стенограмму с переписыванием


Я установил это правило (в 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 /эпизод/название сообщения/2/ переход к www.domain.com / эпизод/имя после публикации/расшифровка/ но это все равно будет /2/.

Достаточно интересно, если я введу www.domain.com / эпизод/имя сообщения/расшифровка/ он все еще работает, но делает перенаправление на /2/.

Я установил плагин анализатора перезаписи, и он не выдает мне никаких ошибок... мой тип сообщения это "эпизоды", а пуля/URL-адрес - "эпизод"

Может ли кто-нибудь, пожалуйста, направить меня? Бесконечно благодарен... Сара

Author: Sarah, 2015-03-12

1 answers

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
Author: TheDeadMedic, 2015-03-12 20:47:42