Маршрутизация React в wordpress

#wordpress #reactjs #.htaccess #react-router

#wordpress #reactjs #.htaccess #react-маршрутизатор

Вопрос:

Я создаю react SPA с WordPress, работающим в качестве серверной части, но он не безголовый, поэтому весь интерфейс включен в тему. Я просто запускаю сборку npm и ставлю в очередь производственные файлы в functions.php файл. Приложение отображается в <div id="root"></div> файле шаблона. Моя установка WordPress настроена на статическую домашнюю страницу, которая использует шаблон, содержащий корневой каталог React.

Кажется, это работает просто отлично, кроме маршрутизатора. Если я перейду, скажем, на другой адрес https://mywebsite/about , он попытается загрузить страницу WordPress с именем about , вместо того, чтобы оставаться на той же странице и использовать маршрутизатор для отображения соответствующего компонента. Есть ли какие-то настройки, которые я должен изменить в файле .htaccess? Или есть что-то еще, чего мне не хватает?

Комментарии:

1. Нормально ли работают обычные ссылки в вашем SPA? Это просто прямой доступ к URL, который приводит к 404?

2. Я должен был упомянуть об этом. Ссылки работают нормально (он изменяет URL и отображает правильный компонент). Это прерывается только тогда, когда я ввожу URL вручную.

3. Она по-прежнему безголовая, если вы используете react только для темы и извлекаете данные из WP Api. Отсутствие Headless не означает, что вы не можете использовать его в качестве темы WP.

4. Насколько я знаю, веб-сайт без головы — это сайт, в котором бэкэнд и интерфейс полностью независимы. В этом случае интерфейс встроен в серверную часть, он не является автономным. Часть отображаемых данных извлекается из REST API, но некоторые отображаются php при первой загрузке страницы.

Ответ №1:

Если у вас есть приложение React на вашей странице WP, и вы не хотите редактировать .htaccess, вы также можете добавить правила перезаписи с помощью add_rewrite_rule() в functions.php перенаправлять все запросы на страницу вашего приложения react на WP, которые будут обрабатываться маршрутизатором React.

 add_action('init', 'wp55290310_rewrite_rules');

function wp55290310_rewrite_rules() {
    add_rewrite_rule('^your-react-app-root/(. )?', 'index.php?pagename=your-react-page-name', 'top');
}
  

Вам нужно указать базовое имя в React Router:

 <BrowserRouter basename="/your-react-app-root">
  <Switch>
      <Route exact path="/" component={SomeComponent} />
      <Route exact path="/other-page" component={OtherComponent} />
  </Switch>
</BrowserRouter>
  

Комментарии:

1. кроме того, требуется удаление постоянных ссылок WordPress. Просто войдите в Настройки >> Постоянные ссылки и сохраните изменения. Это очистит ваш «кэш постоянных ссылок».

2. add_rewrite_rule Работает, спасибо. Мне не нужно было устанавливать basename , просто работает с React Router 5.1.2

3. Что я должен включить для ‘your-react-page-name’

4. @CraZyDroiD ‘your-react-page-name’ должно быть названием страницы, на которую вы перенаправляете (например, yoursite.com/testpage / -> тестовая страница).

Ответ №2:

Да, ответ лежит внутри файла .htaccess.

Вам нужно настроить общее правило, которое будет обслуживать index.php файл для всех маршрутов вместо того, чтобы пытаться найти соответствующий php-файл для маршрута, который происходит сейчас.

Вы должны быть в состоянии использовать эту конфигурацию для достижения такого поведения:

 # BEGIN WordPress

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
  

Решение подразумевает, что вы используете modrewrite на своем сервере.

Комментарии:

1. Это действительно сработало, но я обнаружил, что вдобавок мне нужно отключить постоянные ссылки (через панель управления -> настройки -> постоянные ссылки -> установить значение «обычный»). До этого, когда весь трафик направлялся на index.php маршрутизатор wordpress перехватывал этот трафик до маршрутизатора react.

2. Странно, я использую пользовательское название публикации или постоянные ссылки пользовательской структуры с этой конфигурацией без проблем

3. При таком подходе я получаю ошибку 404 в консоли (хотя react хорошо обрабатывает маршруты). Есть ли способ сделать ответ wordpress равным 200 вместо 404?