Как передать параметр поиска $_GET на новую пользовательскую страницу поиска?

26 нояб. 2013 г., 17:29:08
Просмотры: 21.5K
Голосов: 4

На данный момент в моей установке 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-выводом.

Что я могу сделать, чтобы передать поисковый запрос на эту страницу?

0
Все ответы на вопрос 2
1
10

Проблема в том, что параметр 's' является стандартным параметром запроса WordPress. Когда вы используете URL вида /custom-search?s=mysearchstring, вы говорите WordPress найти страницу 'custom-search', содержащую строку 'mysearchstring', что приводит к ошибке 404.

У вас есть 2 варианта решения:

  1. использовать другой параметр запроса, например /custom-search?cs=mysearchstring, а затем в шаблоне страницы использовать переменную $_GET['cs'] вместо $_GET['s']
  2. отправлять все поисковые запросы на главную страницу: /?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. оно более производительное: если вы используете решение 1, выполняются два запроса — первый для получения страницы, второй для результатов поиска; в решении 2 выполняется только один запрос
26 нояб. 2013 г. 19:16:01
Комментарии

Спасибо! Теперь понял. Я воспользуюсь первым решением, так как мне нужны обе страницы поиска. Название custom-search было чисто демонстрационным.

Glorious Kale Glorious Kale
26 нояб. 2013 г. 20:16:56
0

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

Честно говоря, ваш пользовательский поиск выглядит практически так же, как обычный поиск, поэтому мне не совсем понятно, зачем вы это делаете.

26 нояб. 2013 г. 18:19:54