Измените страницу /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-адрес - "эпизод"
Может ли кто-нибудь, пожалуйста, направить меня? Бесконечно благодарен... Сара
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' );