Перенаправление URLs подстраниц на родительскую без изменения URL

Вопрос или проблема

У меня проблема с правилами перенаправления для одностраничного приложения, которое находится на подп странице сайта на 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).

Вот как вы можете это сделать:

  1. Используйте функцию add_rewrite_rule() правильно. Убедитесь, что вы добавляете правило переписывания так, чтобы при заходе на подстраницу выполнялся запрос к основной странице, но не было фактического редиректа. В вашем случае необходимо зафиксировать, что это относится ко всем подстраницам текущего местоположения.

  2. Обновите вашу функцию. Измените код вашей функции следующим образом:

// Эта функция срабатывает при сохранении поста
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);
  1. Обновите правила переписывания. После того как вы внесли эти изменения, убедитесь, что вы обновили свои правила переписывания. Вы можете сделать это, просто перейдя в настройки постоянных ссылок в админке WordPress и нажмите "Сохранить изменения". Это заставит WordPress обновить свои правила.

  2. Проверьте работу вашего Vue.js приложения. Убедитесь, что ваше приложение теперь может правильно обрабатывать навигацию при посещении адресов вроде http://business.com/hollywood-ca/contact.

Такое изменение должно позволить вашему приложению работать как задумано, и при этом URL будет оставаться неизменным. Если у вас возникнут ещё вопросы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...