Как передать параметр поиска $_GET на новую пользовательскую страницу поиска?
На данный момент в моей установке WordPress есть стандартная страница поиска, которую я могу вызвать перейдя по:
/?s=mysearchstring
И это ищет по страницам WordPress, содержащим строку "mysearchstring
".
Я создал новую страницу "Custom Search" (/custom-search/
) и назначил ей файл шаблона custom-search.php
(тот же код, что и в search.php
).
Как я могу добавить параметр ключевого слова к этой странице?
/custom-search?s=mysearchstring
не работает, показывает только ошибку 404 Page Not Found, в то время как /custom-search/
отображает страницу поиска как единственный результат.
Код custom-search.php
:
<?php
/*
Название шаблона: Пользовательский поиск
*/
//ID записи
global $wp_query;
$content_array = $wp_query->get_queried_object();
if(isset($content_array->ID)){
$post_id = $content_array->ID;
}
else $post_id=0;
$template_uri = get_template_directory_uri();
//Поиск
$allsearch = &new WP_Query("s=$s&showposts=-1");
$count = $allsearch->post_count;
wp_reset_query();
$hits = $count == 1 ? $count." ".__("результат для","goodweb") : $count." ".__("результатов для","goodweb");
get_header();
?>
вместе с HTML-выводом.
Что я могу сделать, чтобы передать поисковый запрос на эту страницу?

Проблема в том, что параметр 's'
является стандартным параметром запроса WordPress. Когда вы используете URL вида /custom-search?s=mysearchstring
, вы говорите WordPress найти страницу 'custom-search'
, содержащую строку 'mysearchstring'
, что приводит к ошибке 404.
У вас есть 2 варианта решения:
- использовать другой параметр запроса, например
/custom-search?cs=mysearchstring
, а затем в шаблоне страницы использовать переменную$_GET['cs']
вместо$_GET['s']
- отправлять все поисковые запросы на главную страницу:
/?s=mysearchstring
, но с использованием хука'template_include'
для загрузкиcustom-search.php
вместоsearch.php
. Это можно сделать без создания страницы 'custom-search'.
Решение 1
Все, что нужно сделать — использовать параметр запроса 'cs'
вместо 's'
, а затем в шаблоне использовать:
// ...
$s = filter_input(INPUT_GET, 'cs', FILTER_SANITIZE_STRING);
$allsearch = &new WP_Query("s=$s&showposts=-1");
// ...
Решение 2
Удалите страницу 'custom-page', которая использует шаблон "Custom Search"
: она вам не нужна. Вы также можете полностью удалить заголовки шаблона, если хотите.
Отправляйте все поисковые запросы на /?s=mysearchstring
.
Теперь в ваш functions.php
добавьте:
add_filter('template_include', 'my_custom_search_template');
function my_custom_search_template( $template ) {
if ( is_search() ) {
$ct = locate_template('custom-search.php', false, false);
if ( $ct ) $template = $ct;
}
return $template;
}
Таким образом, все поисковые запросы будут отображаться с использованием вашего custom-search.php
(если он существует). Обратите внимание, что поиск уже выполняется в основном запросе, поэтому вам не нужно запускать его снова. Если вы хотите установить posts_per_page
в -1, используйте pre_get_posts
:
add_action('pre_get_posts', 'search_no_paging');
function search_no_paging( $q ) {
if ( $q->is_main_query() && $q->is_search() && ! is_admin() ) {
$q->set('posts_per_page', -1);
}
}
А в вашем custom-search.php
используйте:
global $wp_query;
$count = $wp_query->post_count;
$hits = $count == 1 ? $count." ".__("результат для","goodweb") : $count." ".__("результатов для","goodweb");
get_header();
while( have_posts() ) { the_post();
// ваш цикл здесь
}
Как видите, вам не нужно выполнять дополнительный запрос, так как основная выборка уже сделана.
Решение 1 — лучший выбор, если вы хотите отображать содержимое страницы вместе с результатами поиска. Но если вы создаете эту страницу без контента только для использования пользовательского шаблона для результатов поиска, то решение 2 лучше, потому что:
- оно не зависит от темы: код можно поместить в плагин и использовать с любой темой, а также не требуется создавать страницу в админке
- оно более производительное: если вы используете решение 1, выполняются два запроса — первый для получения страницы, второй для результатов поиска; в решении 2 выполняется только один запрос

Строка GET
будет работать так же, как и в любом другом PHP-приложении, но вы не можете использовать параметр запроса, который использует WordPress. В этом и состоит проблема. WordPress уже использует параметр s
. Используйте что-то другое, например, 'mys'.
Честно говоря, ваш пользовательский поиск выглядит практически так же, как обычный поиск, поэтому мне не совсем понятно, зачем вы это делаете.
