На моей домашней странице у меня есть форма с тремя раскрывающимися списками. После нажатия кнопки отправки я отправляю аргументы формы на сервер через запрос 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-адреса загрузит страницу без аргументов.
Я пытаюсь найти решение этой проблемы. У кого-нибудь есть идеи? Я что-то не так делаю?
Любая помощь приветствуется!






Я понял, чего не хватает. Мне также нужно было добавить правило перезаписи, чтобы преобразовать 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¶m1=$matches[1]¶m2=$matches[2]¶m3=$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/