Как поменять basement React Маршрутизатора?

Ссылка скопирована
1 ответ

Есть 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" ?

  • szQocks, страницы динамически меняются, но element не включается. Получается Маршрутизатор работает не до конца правильно...

    Переход осуществляется с помощью <Link to="?page=my_plugin#/create">Create</Link>

    NavLink работает точно также

  • szQocks,
    &lt;Link to="/wp-admin/admin.php?page=quizcraft#/create"&gt;Create&lt;/Link&gt;

    &lt;Link to="/wp-admin/admin.php?page=quizcraft#/create"&gt;Create&lt;/Link&gt;

    также не работает, хотя именно оно подходит по условию "/wp-admin/:page?/create"

  • Evgeniy, да я понял, не подскажу
  • После долгих поисков, обнаружил HashRouter, который как раз решает эту проблему.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Web-разработка Ответ

    Для 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

    /wp-admin/admin.php?page=my_plugin#/create

    React:

    import { HashRouter, Routes, Route, Link } from 'react-router-dom';
     
    function App() {
      return (
        &lt;HashRouter&gt;
          &lt;nav&gt;
            &lt;Link to="/create"&gt;Create&lt;/Link&gt;
          &lt;/nav&gt;
     
          &lt;Routes&gt;
            &lt;Route path="/" element={&lt;Dashboard /&gt;} /&gt;
            &lt;Route path="/create" element={&lt;CreatePage /&gt;} /&gt;
          &lt;/Routes&gt;
        &lt;/HashRouter&gt;
      );
    }

    import { HashRouter, Routes, Route, Link } from 'react-router-dom'; function App() { return ( &lt;HashRouter&gt; &lt;nav&gt; &lt;Link to="/create"&gt;Create&lt;/Link&gt; &lt;/nav&gt; &lt;Routes&gt; &lt;Route path="/" element={&lt;Dashboard /&gt;} /&gt; &lt;Route path="/create" element={&lt;CreatePage /&gt;} /&gt; &lt;/Routes&gt; &lt;/HashRouter&gt; ); }

    Так 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);
    });

    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.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно