Как выполнить поиск только по названию поста и категории?

Вопрос или проблема

Я в настоящее время работаю над своей первой темой (на основе 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, чтобы получить результаты поиска, соответствующие заданным условиям.

Шаги для реализации:

  1. Поиск по заголовкам постов:

    Необходимо создать запрос 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 для оптимизации
    ));
  2. Поиск по категориям:

    Второй запрос будет выполнен для поиска по категориям. Используйте 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(),
           ),
       ),
    ));
  3. Объединение результатов:

    После выполнения обоих запросов необходимо объединить результаты. array_merge поможет вам объединить массивы ID:

    $merged_ids = array_unique(array_merge($q1, $q2));

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

  4. Отображение результатов:

    После объединения 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();
  5. Оптимизация:

    При необходимости можно использовать объект WPDB для оптимизации запросов на уровне MySQL, особенно если количество данных велико и требуется более высокая производительность. Однако, для типичных задач WP_Query будет достаточным и менее сложным в реализации.

Заключение:

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

Оцените материал
Добавить комментарий

Капча загружается...