Расширенный поиск для WordPress

В течении многих лет по умолчанию для формы поиска был установлен единый параметр querystring с названием "s". В этом нет ничего плохого. Но в ядре WordPress при поиске, приложение анализирует и ряд других параметров, это даёт нам возможность показать более целенаправленный набор результатов поиска без помощи плагинов.

Оглавление:
  1. Расширенный поиск
  2. Поиск в определённой рубрике
  3. Поиск в определённой метке
  4. Подключить расширенный поиск
  5. Заключение

Озеро Самарцы - Отдых в Крыму для всей семьи!
Адрес: Крым, Белогорский район, с. Зуя
Тел: +7(978)1176627 http://samartsy.ru/

Расширенный поиск

Мы можем создать форму расширенного поиска с помощью HTML и немного PHP что бы автоматизировать функции.

Поиск в определённой рубрике

Передавая параметр category_name можно ограничить результаты поиска в определённой рубрике, например:

http://yoursite.ru/?s=dialog&category_name=html5

Форма ниже, даёт возможность пользователю уточнить свой выбор поиска из конкретной рубрики:

<form method="get" action="<?php bloginfo('url'); ?>">
 <fieldset>
  <input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" />
  <select name="category_name">
   <option value="">все рубрики</option>
   <option value="html5">html5</option>
   <option value="css3">css3</option>
  </select>
  <button type="submit">Поиск</button>
 </fieldset>
</form>

Есть возможность показать пользователю список всех рубрик сайта, изменив код между тегами <select> и </select>:

<form method="get" action="<?php bloginfo('url'); ?>">
 <fieldset>
  <input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" />
  <select name="category_name">
   <?php
   // генератор списка рубрик
   $categories = get_categories();
   foreach ($categories as $category) {
      echo '<option value="', $category->slug, '">', $category->name, "</option>\n";
   }
   ?>
   </select>
  <button type="submit">Поиск</button>
 </fieldset>
</form>
К началу

Поиск в определённой метке

Передавая параметр tag можно ограничить результаты поиска определённой меткой, например:

http://yoursite.com/?s=shadow&tag=css3

Форма ниже даёт возможность пользователю уточнить свой выбор поиска из конкретной метки:

<form method="get" action="<?php bloginfo('url'); ?>">
 <fieldset>
  <input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" />
  <select name="tag">
   <option value="">все метки</option>
   <option value="css3">css3</option>
   <option value="design">дизайн</option>
  </select>
  <button type="submit">Поиск</button>
 </fieldset>
</form>

Так же есть возможность показать пользователю список всех меток сайта:

<form method="get" action="<?php bloginfo('url'); ?>">
 <fieldset>
  <input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" />
   <select name="tag">
    <?php
    // генератор списка меток
    $tags = get_tags();
    foreach ($tags as $tag) {
       echo '<option value="', $tag->slug, '">', $tag->name, "</option>\n";
    }
    ?>
   </select>
   <button type="submit">Поиск</button>
 </fieldset>
</form>
К началу

Подключить расширенный поиск

Предположим нужно настроить поиск с несколькими значениями. Например, пользователь может выбрать для поиска две или более метки, а результат  должен отобразить на странице весь набор. Мы не можем получить такой результат используя параметры по одному URL.

Сначала для поиска определим форму HTML:

<form method="get" action="<?php bloginfo('url'); ?>">
 <fieldset>
   <input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" />
   <p>Уточните пожалуйста метки для поиска:</p>
     <?php
     // генератор списка меток
     $tags = get_tags();
     foreach ($tags as $tag) {
       echo
         '<label>',
         '<input type="checkbox" name="taglist[]" value="',  $tag->slug, '" /> ',
         $tag->name,
         "</label>\n";
     }
     ?>
    <button type="submit">Поиск</button>
 </fieldset>
</form>

В коде используется массив PHP с именем taglist. Вы можете использовать любое имя кроме зарезервированных в WordPress.

Что бы добавить расширенный поиск в WordPress, открываем файл functions.php активной темы и вставляем функцию:

// расширенные возможности поиска
function advanced_search_query($query) {

    if($query->is_search()) {

        // tag search
        if (isset($_GET['taglist']) && is_array($_GET['taglist'])) {
            $query->set('tag_slug__and', $_GET['taglist']);
        }

        return $query;
    }

}

Функция advanced_search_query проверяет является ли поиск активным и устанавливает для WP_Query параметр tag_slug__and

Наконец, нужно зарегистрировать действие pre_get_posts, чтобы запустить функцию advanced_search_query для выполнения запросов расширенного поиска:

add_action('pre_get_posts', 'advanced_search_query', 1000);
К началу

Заключение

Добавить продвинутые возможности поиска в WordPress на удивление просто. Надеюсь, что для вас расширенный поиск будет полезным в следующих проектах WordPress.

автор PHP899
htmlhook.ru | Скрипты для веб-приложений