Вопрос или проблема
У меня проблема с правилами перенаправления для одностраничного приложения, которое находится на подп странице сайта на WordPress. Я следовал этому набору инструкций довольно точно и все еще сталкиваюсь с проблемами: Перенаправление подп страниц на родительскую без изменения URL
Подстраницы – это пользовательские типы записей для местоположений бизнеса. Когда кто-то посещает http://business.com/hollywood-ca/contact
, должно открываться http://business.com/hollywood-ca/
, но URL должен оставаться прежним (часть URL «contact» является частью одностраничного приложения Vue.js на каждой странице местоположения, поэтому она должна оставаться). Вот мой код:
// Эта функция срабатывает при сохранении записи
function add_location_deep_links( $post_id, $post, $update ) {
$post_type = get_post_type($post_id);
if ( "location" != $post_type ) return; // Если это не запись 'location', не обновлять.
$slug = $post->post_name; //hollywood-ca
add_rewrite_rule(
"^{$slug}/[A-Za-z]", //regex предотвращает попытку перенаправления страницы /hollywood-ca/
"index.php?page_id={$post_id}", //перенаправление на запись
'top' // иметь преимущество над другими перенаправлениями
);
flush_rewrite_rules();
}
Проблема в том, что когда я посещаю http://business.com/hollywood-ca/contact
, страница перенаправляется на http://business.com/hollywood-ca/
, что мешает моему одностраничному приложению перейти на вкладку контактов.
Если это поможет, я также написал несколько функций, которые изменяют мои URL с business.com/location/hollywood-ca
на более чистый business.com/hollywood-ca
. Я протестировал эти проблемы без этих функций и по-прежнему сталкиваюсь с проблемами, поэтому не думаю, что они связаны.
Комментарий Мило помог мне в этом:
add_rewrite_rule(
"^{$slug}/",
"index.php?location={$slug}", //изменена переменная запроса на location
'top'
);
Ответ или решение
Для того чтобы правильно настроить редирект подстраниц на родительскую страницу, не меняя URL, вам нужно внести соответствующие правки в функции вашего WordPress-сайта. Проблема, с которой вы столкнулись, связана с тем, что ваш Vue.js приложение требует, чтобы URL оставался неизменным, чтобы правильно обрабатывать навигацию внутри одностраничного приложения (SPA).
Вот как вы можете это сделать:
-
Используйте функцию
add_rewrite_rule()
правильно. Убедитесь, что вы добавляете правило переписывания так, чтобы при заходе на подстраницу выполнялся запрос к основной странице, но не было фактического редиректа. В вашем случае необходимо зафиксировать, что это относится ко всем подстраницам текущего местоположения. -
Обновите вашу функцию. Измените код вашей функции следующим образом:
// Эта функция срабатывает при сохранении поста
function add_location_deep_links( $post_id, $post, $update ) {
// Получаем тип поста
$post_type = get_post_type($post_id);
if ( "location" != $post_type ) return; // Если это не пост типа 'location', выходим.
$slug = $post->post_name; // получаем слаг
// Добавляем правило переписывания для всех подстраниц
add_rewrite_rule(
"^{$slug}/(.*)", // Регулярное выражение захватывает всё после слага
"index.php?location={$slug}", // Изменяем получаемый параметр
'top' // давим приоритет другим редиректам
);
flush_rewrite_rules();
}
// Регистрация функции хука
add_action('save_post', 'add_location_deep_links', 10, 3);
-
Обновите правила переписывания. После того как вы внесли эти изменения, убедитесь, что вы обновили свои правила переписывания. Вы можете сделать это, просто перейдя в настройки постоянных ссылок в админке WordPress и нажмите "Сохранить изменения". Это заставит WordPress обновить свои правила.
-
Проверьте работу вашего Vue.js приложения. Убедитесь, что ваше приложение теперь может правильно обрабатывать навигацию при посещении адресов вроде
http://business.com/hollywood-ca/contact
.
Такое изменение должно позволить вашему приложению работать как задумано, и при этом URL будет оставаться неизменным. Если у вас возникнут ещё вопросы, не стесняйтесь спрашивать!