Поиск по слову, категории, тегу, автору
Для создания страницы поиска с возможностями поиска по: 1) слову 2) тегу 3) категории 4) автору Вы можете использовать WordPress WP_Query с параметрами поиска. Вот пример реализации:
// Получаем параметры поиска
$search_word = isset($_GET['s']) ? sanitize_text_field($_GET['s']) : '';
$search_tag = isset($_GET['tag']) ? (int)$_GET['tag'] : 0;
$search_cat = isset($_GET['cat']) ? (int)$_GET['cat'] : 0;
$search_author = isset($_GET['author']) ? (int)$_GET['author'] : 0;
// Формируем параметры запроса
$args = array(
'post_type' => 'post',
'posts_per_page' => 10
);
// Добавляем поиск по слову
if(!empty($search_word)) {
$args['s'] = $search_word;
}
// Добавляем поиск по тегу
if($search_tag > 0) {
$args['tag_id'] = $search_tag;
}
// Добавляем поиск по категории
if($search_cat > 0) {
$args['cat'] = $search_cat;
}
// Добавляем поиск по автору
if($search_author > 0) {
$args['author'] = $search_author;
}
// Выполняем поиск
$query = new WP_Query($args);
// Выводим результаты
if($query->have_posts()) :
while($query->have_posts()) : $query->the_post();
// Вывод постов
get_template_part('template-parts/content', 'search');
endwhile;
else :
echo 'Ничего не найдено';
endif;
wp_reset_postdata();
А вот пример формы поиска:
<form method="get" action="<?php echo esc_url(home_url('/')); ?>">
<input type="text" name="s" placeholder="Поиск по слову" value="<?php echo get_search_query(); ?>">
<select name="cat">
<option value="">Выберите категорию</option>
<?php
$categories = get_categories();
foreach($categories as $category) {
echo '<option value="' . $category->term_id . '">' . $category->name . '</option>';
}
?>
</select>
<select name="tag">
<option value="">Выберите тег</option>
<?php
$tags = get_tags();
foreach($tags as $tag) {
echo '<option value="' . $tag->term_id . '">' . $tag->name . '</option>';
}
?>
</select>
<select name="author">
<option value="">Выберите автора</option>
<?php
$authors = get_users(['who' => 'authors']);
foreach($authors as $author) {
echo '<option value="' . $author->ID . '">' . $author->display_name . '</option>';
}
?>
</select>
<button type="submit">Поиск</button>
</form>
Вам нужно добавить переключатели (radio buttons) в форму поиска. Затем добавьте фильтр к вашему поиску:
function filter_search( $query ) {
if( $query->is_search ) {
if ( isset($_GET['tag']) )
// измените ваш поисковый запрос здесь.
}
return $query;
}
add_filter( 'pre_get_posts' , 'filter_search' );
Под влиянием http://wordpress.org/support/topic/how-to-add-search-filter-by-custom-values#post-1463329

Если вы предпочитаете, чтобы всю работу за вас выполнял плагин WordPress, обратите внимание на Search Everything в репозитории плагинов WordPress.
Улучшает стандартный функционал поиска WordPress в три простых шага с помощью Search Everything.
Улучшенный поиск в WordPress за три шага
Активировать → Настроить параметры → Искать (может быть, это всего два шага).
Настройки включают подсветку результатов, поиск по страницам, отрывкам, вложениям, черновикам, комментариям и пользовательским полям (метаданным).
Что делает плагин:
Search Everything расширяет возможности стандартного поиска WordPress, доступны следующие опции:
- Подсветка результатов поиска
- Поиск по всем страницам
- Поиск по всем меткам
- Поиск по пользовательским таксономиям (новая функция)
- Поиск по всем категориям
- Поиск только по страницам без пароля
- Поиск по всем комментариям
- Поиск только по одобренным комментариям
- Поиск по всем черновикам
- Поиск по всем отрывкам
- Поиск по всем вложениям (тип записи)
- Поиск по всем пользовательским полям (метаданным)
- Исключение записей из поиска
- Исключение категорий из поиска
[Плагин WordPress]: Search Everything

Отличная идея, я попробовал для поиска по пользовательским типам записей, и это работает, спасибо!

Этот плагин полезен, но делает противоположное тому, что мне нужно: он принимает слово на вход и ищет его в метках, категориях, заголовках и т.д. Мне же нужны критерии типа: категорияZ & метка "XYY" & заголовок содержит "Дом". Так что, полагаю, этот плагин здесь не подходит. Верно?
