Передача нескольких аргументов через URL-адрес в Wordpress

На моей домашней странице у меня есть форма с тремя раскрывающимися списками. После нажатия кнопки отправки я отправляю аргументы формы на сервер через запрос GET, а затем перенаправляю на страницу search-results.php, чтобы показать результаты поиска на основе трех аргументов. Мне нужны аргументы в URL-адресе на случай, если пользователь хочет воспроизвести поиск, просто скопировав и вставив URL-адрес. Моя проблема в том, что при загрузке страницы результатов поиска в URL-адресе отображается только первый аргумент, а когда я перезагружаю страницу, только этот аргумент может быть получен на сервере. У меня включены довольно постоянные ссылки, но их отключение не имело никакого значения.

Вот код моей формы:

<form action = "{{ esc_url( admin_url( 'admin-post.php' )) }}" method = "GET">
  <input name = "action" type = "hidden" value = "form_response">
  <select name = "param1">
    <option value = "1">1</option>
    <option value = "2">2</option>
    <option value = "3">3</option>
  </select> 
  <select name = "param2">
    <option value = "1">1</option>
    <option value = "2">2</option>
    <option value = "3">3</option>
  </select> 
  <select name = "param3">
    <option value = "1">1</option>
    <option value = "2">2</option>
    <option value = "3">3</option>
  </select> 
  <button type = "submit" name = "search_button">Search</button>
</form>

Затем на сервере я получаю запрос GET со всеми аргументами, обрабатываю поиск и перенаправляю на страницу результатов поиска:

$url = add_query_arg(array(
  'param1' => $_GET['param1'],
  'param2' => $_GET['param2'],
  'param3' => $_GET['param3'],
), get_permalink(get_page_by_path('search-results')));  

if (wp_redirect($url)) {
  exit;
}

Я говорю Wordpress принять аргументы, добавив следующий фильтр:

add_filter('query_vars', function($vars) {
  $vars[] = "param1";
  $vars[] = "param2";
  $vars[] = "param3";
  return $vars;
});

Когда страница результатов поиска загружается с правильными данными, URL-адрес выглядит так:

www.mysite.com/search-results/?param1=1

param2 и param3 просто исчезнут. Копирование и вставка этого URL-адреса загрузит страницу без аргументов.

Я пытаюсь найти решение этой проблемы. У кого-нибудь есть идеи? Я что-то не так делаю?

Любая помощь приветствуется!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
917
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я понял, чего не хватает. Мне также нужно было добавить правило перезаписи, чтобы преобразовать URL-адрес с аргументами GET в то, что я хотел:

/**
 * Add a rewrite rule to accept GET arguments on the search results page
 */
add_filter('init', function() {
  add_rewrite_rule(
    // The resulting URL with regex to match the incoming arguments
    'search/([^/]*)/([^/]*)/([^/]*)/?',
    // The expected URL
    'index.php?pagename=search-results&param1=$matches[1]&param2=$matches[2]&param3=$matches[3]',
    // This is a rather specific URL, so we add it to the top of the list
    // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
    'top' );
});

Другими словами, когда Wordpress получает запрос GET для страницы «результаты поиска», содержащий param1 = 1, param2 = 2 и param3 = 3, он переводит его в следующий URL:

www.mysite.com/search-results/1/2/3/

Другие вопросы по теме