Показать совпадающие категории на странице поиска

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

Мой текущий поиск показывает только ПОСТЫ в качестве результатов.

http://newslines.org/?s=george

На моем сайте есть категории для Джорджа Клуни, Джорджа Р. Р. Мартина и т. д. Как мне получить список категорий, соответствующих поисковому запросу, чтобы он отображался в верхней части страницы результатов?

Я пробовал это:

<?php 
$search_query = get_search_query();

$term = get_term_by( 'name', $search_query, 'category' );
if ( !empty( $terms ) && !is_wp_error( $terms ) ){
    echo "<ul>";
    foreach ( $terms as $term ) {
    echo "<li>" . $term->name . "</li>"; 
    }
    echo "</ul>";
}
;?> 

Но я не получаю никаких результатов

По сути, вам нужно показать категории, к которым принадлежат текущие запрашиваемые посты. Я опубликую здесь функцию, которая принимает в качестве аргумента таксономию (или массив таксономий) и возвращает все термины в этой (этих) таксономии(ях), которые присвоены всем запрашиваемым постам.

function queried_posts_terms( $taxonomies="category" ) {
  global $wp_query, $wpdb;
  if ( empty( $wp_query->posts ) ) return FALSE;
  $ids = wp_list_pluck( $wp_query->posts, 'ID' );
  $taxonomies = array_filter( (array) $taxonomies, function( $tax ) {
    if ( is_string( $tax ) ) {
      $tax = sanitize_title( $tax );
      return taxonomy_exists( $tax ) ? esc_sql( $tax ) : NULL;
    }
  } );
  if ( empty( $taxonomies ) ) return FALSE;
  $sql = "SELECT t.name, t.slug, t.term_group, tt.*
    FROM {$wpdb->terms} t
    INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
    INNER JOIN {$wpdb->term_relationships} tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
    WHERE tr.object_id IN (" . implode( ', ', $ids ) . ")
    AND tt.taxonomy IN ('" . implode( "', '", $taxonomies ) . "')
    GROUP BY t.term_id";
  return $wpdb->get_results( $sql );
}

Как только у вас будет эта функция в вашем functions.php (или в активном плагине) в вашем шаблоне, вероятно search.php, просто используйте:

if ( is_search() ) {
  $cats = queried_posts_terms( 'category' );
  echo ! empty( $cats ) ? '<ul>' : '';
  foreach( $cats as $cat ) {
    printf( '<li><a href="https://wordpress.stackexchange.com/questions/158895/%s">%s</a></li>', get_term_link($cat), esc_html($cat->name) );
  }
  echo ! empty( $cats ) ? '</ul>' : '';
}

Вы можете отредактировать свой файл search.php, чтобы фактически выполнить несколько циклов поиска, как это…

    global $query_string;

    $query_args = explode("&", $query_string);
    $search_query = array();

    foreach($query_args as $key => $string) {
        $query_split = explode("=", $string);
        $search_query[$query_split[0]] = urldecode($query_split[1]);
    } // foreach

    $first_args = $search_query;

    // настройте свои дополнительные параметры запроса
    // я просто использовал пример только для получения определенной категории, но вы поняли идею

    $first_args['cat'] = 162;
    $first_args['orderby'] = 'date';

    $first_search = new WP_Query($first_args);

    // Здесь выведите свои результаты цикла

   endwhile;
   wp_reset_query();

По сути, вы берете строку запроса (поисковую строку) и выполняете пользовательский WP_Query, используя ваши дополнительные параметры. После того как вы выполните первый пользовательский запрос, чтобы получить соответствующие категории, вы можете просто запустить дополнительный запрос, используя исходную $query_string.

Я знаю, что это не совсем то, что вы хотите, но это должно дать вам отправную точку, чтобы это произошло. Я рад помочь, если у вас есть дополнительные вопросы.

Ответ или решение

Как отобразить совпадающие категории на странице поиска в WordPress

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

1. Проблема: Отображение только постов в результате поиска

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

2. Решение: Создание функции для получения категорий

Для начала вам необходимо создать функцию, которая будет возвращать категории, соответствующие запросу. Мы будем использовать следующие аспекты:

  • Использование глобальных переменных WP_Query и wpdb.
  • Запрос к базе данных для получения всех категорий, связанных с найденными постами.

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

function queried_posts_terms($taxonomies = "category") {
    global $wp_query, $wpdb;

    if (empty($wp_query->posts)) return FALSE;

    $ids = wp_list_pluck($wp_query->posts, 'ID');
    $taxonomies = array_filter((array)$taxonomies, function($tax) {
        if (is_string($tax)) {
            $tax = sanitize_title($tax);
            return taxonomy_exists($tax) ? esc_sql($tax) : NULL;
        }
    });

    if (empty($taxonomies)) return FALSE;

    $sql = "SELECT t.name, t.slug, t.term_group, tt.*
            FROM {$wpdb->terms} t
            INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
            INNER JOIN {$wpdb->term_relationships} tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
            WHERE tr.object_id IN (" . implode(', ', $ids) . ")
            AND tt.taxonomy IN ('" . implode("', '", $taxonomies) . "')
            GROUP BY t.term_id";

    return $wpdb->get_results($sql);
}

3. Встраивание функции на страницу поиска

Теперь вам нужно интегрировать эту функцию в файл search.php, чтобы категории отображались на странице результатов поиска.

if (is_search()) {
    $cats = queried_posts_terms('category');
    if (!empty($cats)) {
        echo '<ul>';
        foreach ($cats as $cat) {
            printf('<li><a href="%s">%s</a></li>', esc_url(get_term_link($cat)), esc_html($cat->name));
        }
        echo '</ul>';
    }
}

4. Альтернативный подход: Использование кастомных запросов

Если вы хотите более гибко управлять запросами и получать как посты, так и категории одновременно, вы можете использовать метод работы с несколькими запросами. Например, написав дополнительный WP_Query, чтобы извлекать категории на основе оригинального запроса:

global $query_string;
$query_args = explode("&", $query_string);
$search_query = [];

foreach ($query_args as $key => $string) {
    $query_split = explode("=", $string);
    $search_query[$query_split[0]] = urldecode($query_split[1]);
}

// Выполните дополнительный запрос для категорий
$first_args = $search_query;
$first_args['cat'] = 162; // здесь указать ID определенной категории
$first_args['orderby'] = 'date';

$first_search = new WP_Query($first_args);
// Обработка результатов

Заключение

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

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

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