Вопрос или проблема
Я в настоящее время работаю над своей первой темой (на основе underscores) и только что понял, что поиск не возвращает никаких результатов, если я ввожу имя категории, и не дает точных результатов при поиске по заголовкам.
Итак, как мне сделать, чтобы моя тема искала только по “заголовкам постов” и “категориям”? Нужно ли что-то добавить в Functions.php?
Спасибо
Вам нужно будет написать кастомный WP_Query в search.php.
Поскольку вы хотите искать в post_title
+ categories
, возможно, вам нужно будет выполнить 2 отдельные запросы и объединить их результаты в один.
Что-то вроде:
$q1 = get_posts(array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => '-1',
's' => get_search_query()
));
$q2 = get_posts(array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => '-1',
'tax_query' => array(
//YOUR tax query here
)
));
$merged = array_merge( $q1, $q2 );
И использовать $merged
для отображения ваших результатов.
Также вы можете использовать WPDB
для выполнения этой задачи с помощью MySQL-запроса.
Ответ или решение
Для решения задачи поиска только по заголовкам постов и категориям в вашей теме WordPress (основанной на Underscores) нужно внести изменения в файл search.php
. Вам потребуется создать пользовательские запросы WP_Query, чтобы получить результаты поиска, соответствующие заданным условиям.
Шаги для реализации:
-
Поиск по заголовкам постов:
Необходимо создать запрос WP_Query, который выполняет поиск только по полю
post_title
. Используйте функциюget_posts
для извлечения результатов поиска:$q1 = get_posts(array( 'post_type' => 'post', 'post_status' => 'publish', 's' => get_search_query(), 'posts_per_page' => '-1', // Получить все записи 'fields' => 'ids' // Получение только ID для оптимизации ));
-
Поиск по категориям:
Второй запрос будет выполнен для поиска по категориям. Используйте
tax_query
для фильтрации по таксономиям:$q2 = get_posts(array( 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => '-1', 'fields' => 'ids', // Получение только ID для оптимизации 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'name', // Здесь используется имя категории 'terms' => get_search_query(), ), ), ));
-
Объединение результатов:
После выполнения обоих запросов необходимо объединить результаты.
array_merge
поможет вам объединить массивы ID:$merged_ids = array_unique(array_merge($q1, $q2));
Используйте уникальные значения, чтобы избежать дублирования.
-
Отображение результатов:
После объединения ID вам нужно получить сами посты для отображения.
$merged_posts = get_posts(array( 'post__in' => $merged_ids, 'posts_per_page' => '-1', )); foreach ($merged_posts as $post) { setup_postdata($post); // Ваш код для отображения поста } wp_reset_postdata();
-
Оптимизация:
При необходимости можно использовать объект WPDB для оптимизации запросов на уровне MySQL, особенно если количество данных велико и требуется более высокая производительность. Однако, для типичных задач WP_Query будет достаточным и менее сложным в реализации.
Заключение:
Этот метод позволит вашему поиску в теме сосредоточиться исключительно на заголовках постов и категориях, обеспечивая более точные и релевантные результаты для пользователей. Обязательно протестируйте изменения в безопасной среде перед внедрением на живом сайте.