Как поменять basement React Маршрутизатора?
Есть URL "domain.ru/wp-admin/admin.php?page=my_plugin". Мне необходимо сделать этот путь директорией Root для маршрутизации.
Проблема состоит в том, что BrowserRouter не принимает Query String. То есть я могу задать "/wp-admin/admin.php" и будет создаваться страница "/wp-admin/admin.php/create", однако мне нужна страница "wp-admin/admin.php?page=my_plugin#/create".
Что я испытал:
Routes с location "?page=my_plugin"
Route path с префиксом "?page=my_plugin"
Route path с префиксом "?page=my_plugin" вместе с Link to с префиксом "?page=my_plugin"
Route path с ":page"
Как можно решить этот вопрос?
Дополнительно:
path="/wp-admin/:page?/create" ?
Переход осуществляется с помощью <Link to="?page=my_plugin#/create">Create</Link>
NavLink работает точно также
<Link to="/wp-admin/admin.php?page=quizcraft#/create">Create</Link> |
<Link to="/wp-admin/admin.php?page=quizcraft#/create">Create</Link>
также не работает, хотя именно оно подходит по условию "/wp-admin/:page?/create"
После долгих поисков, обнаружил HashRouter, который как раз решает эту проблему.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для React-приложения внутри админки WordPress по адресу
admin.php?page=my_pluginлучше использоватьHashRouter, а неBrowserRouter. Причина как раз в том, что WordPress admin page живёт в query string, а BrowserRouter ожидает нормальный path. В админке проще и стабильнее маршрутизировать после hash.Нужный формат:
/wp-admin/admin.php?page=my_plugin#/create
React:
import { HashRouter, Routes, Route, Link } from 'react-router-dom'; function App() { return ( <HashRouter> <nav> <Link to="/create">Create</Link> </nav> <Routes> <Route path="/" element={<Dashboard />} /> <Route path="/create" element={<CreatePage />} /> </Routes> </HashRouter> ); }import { HashRouter, Routes, Route, Link } from 'react-router-dom'; function App() { return ( <HashRouter> <nav> <Link to="/create">Create</Link> </nav> <Routes> <Route path="/" element={<Dashboard />} /> <Route path="/create" element={<CreatePage />} /> </Routes> </HashRouter> ); }
Так WordPress продолжает видеть одну админ-страницу
admin.php?page=my_plugin, а React управляет внутренними маршрутами через#/create,#/settingsи т.п.Если принципиально нужен BrowserRouter, придётся делать отдельный rewrite/endpoint и серверную поддержку всех маршрутов, что в wp-admin обычно не нужно и неудобно. Для админских SPA-плагинов HashRouter — нормальная практика.
Ещё проверьте, что ваши assets подключаются только на странице плагина:
add_action('admin_enqueue_scripts', function ($hook) { if ($hook !== 'toplevel_page_my_plugin') { return; } wp_enqueue_script('my-plugin-app', plugin_dir_url(__FILE__) . 'app.js', [], '1.0', true); });
И не пытайтесь вставлять
?page=my_pluginвнутрьRoute path. Для React Router это не часть path, а query string. В вашем случае query string принадлежит WordPress, а маршруты приложения должны жить после hash.