Выведем в результатах поискового запроса категории. Категории будут выведены перед найденными записями.
Категории в результатах поиска
Вставляем в шаблон вывода результатов поиска (search.php), перед началом цикла if(have_posts()) :
<?php $search_term = explode( ' ', get_search_query( false ) );
global $wpdb;
$select = "
SELECT DISTINCT t.*, tt.*
FROM wp_terms AS t
INNER JOIN wp_term_taxonomy AS tt
ON t.term_id = tt.term_id
WHERE tt.taxonomy IN ('category')";
$first = true;
foreach ( $search_term as $s ){
if ( $first ){
$select .= " AND (t.name LIKE '%s')";
$string_replace[] = '%'.$wpdb->esc_like( $s ).'%';
$first = false;
}else{
$select .= " OR (t.name LIKE '%s')";
$string_replace[] = '%'. $wpdb->esc_like( $s ).'%';
}
}
$select .= " ORDER BY t.name ASC";
$terms = $wpdb->get_results( $wpdb->prepare( $select, $string_replace ) );
if ( count($terms) > 0 ){
echo '<ul>';
foreach ( $terms as $term ) {
echo '<li><a href="'.esc_url( get_term_link( $term ) ).'" title="'.esc_attr( $term->name ).'">' . esc_html( $term->name ) . '</a></li>';
}
echo '</ul>';
} ?>
В данном случае категории будут выводится в виде списка.
Чтобы не было лишних терминов, при пустом запросе можно внутри конструкции foreach задать проверку каждого термина if ($term->taxonomy == ‘category’) :
Настройка вида категорий
Сделаем вывод категорий в развернутом виде (миниатюра, описание и т.д.). Модифицируем код вывода:
<?php if ( count($terms) > 0 ) : ?>
<h2>Найденные категории</h2>
<div id="podcat">
<?php foreach ( $terms as $term ) : ?>
<div class="block-podcategory">
<a href="<?php echo get_term_link( $term ); ?>" title="<?php echo $term->name; ?>">
<?php
$category = get_category( $term->term_id ); //Расширяем массив до параметров категории
if ( $category->term_image ) { echo wp_get_attachment_image( $category->term_image, 'square' ); }
else {echo '<div class="cat-image"><img src="'.get_template_directory_uri().'/images/img-default-square.jpg" /></div>';}
?>
</a>
<h2 class="title-2"><a href="<?php echo get_term_link( $term ); ?>" title="<?php echo $term->name; ?>"><?php echo $term->name; ?></a></h2>
<p class="count"><?php echo get_category($term)->category_count; ?></p>
<div class="descript-2"><p><?php if($term->description): ?><?php echo $term->description; ?><?php else: ?>Описание рублики<?php endif; ?></p></div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
$category = get_category( $term->term_id ); — вызываем для того чтобы расширить массив, и подгружать миниатюру категории.
Вышеописанное решение ищет поисковый запрос в названиях категорий, и не имеет особой ценности, если категорий не много. Изменим алгоритм на вывод категорий на основе найденных записей.
Категории найденных записей
Перебираем массив найденных записей, выводим все категории, в которых содержатся эти записи.
<?php
$args = array(
'posts_per_page' => -1,
'post_type' => 'post',
's' => $wp_query->query['s'],
'fields' => 'ids'
);
$searchposts = get_posts( $args );
$search_category_ids = array();
foreach( $searchposts as $post ){
$post_category = get_the_category( $post ); // Если у записи будет несколько категорий, то тут нужно делать массив
$search_category_ids[] = $post_category[0]->term_id;
}
wp_reset_postdata();
$search_category_ids_unique = array_unique($search_category_ids);
echo '<h2>Записи найдены в следующих категориях</h2>';
echo '<div id="podcat">';
foreach( $search_category_ids_unique as $cat_id ){
$cat = get_category( $cat_id );
echo '<div class="block-podcategory"><div>';
echo '<a href="'.get_term_link( $cat ).'" title="'.$cat->name.'">';
if ( $cat->term_image ) { echo wp_get_attachment_image( $cat->term_image, 'square' ); }
else {echo '<div class="cat-image"><img src="'.get_template_directory_uri().'/images/img-default-square.jpg" /></div>';}
echo '</a>';
echo '<h2 class="title-2"><a href="'.get_term_link( $cat ).'" title="'.$cat->name.'">'.$cat->name.'</a></h2>';
echo '</div></div>';
}
echo '</div>';
?>
[site-socialshare]
Здравствуйте! Замечательный код! Очень полезный!
Но есть вопрос… Можно ли сделать в цикле проверку на таксономии?
То есть у меня на сайте в результатах поиска выскакивают как авторы, так и теги
Можно ли сделать проверку? Если таксономия = avtory то выводить допустим с описанием, а если таксономия = tegi, то с картинкой??
У себя я использую код описанный выше — Категории найденных записей. Выводятся только категории. Возможно у Вас еще какая то функция добавляет и авторов.
Здравствуйте! Очень помог ваш код «Категории в результатах поиска», благодарю! Единственный момент, которые не работает совсем верно. К примеру если ввожу в поиск «Белый клык», то у меня кроме самой категории «Белый клык» выводятся все категории со словом «Белый». А если в запросе будет содержаться буква, например «Кот и мышь», то выведутся все категории с буквой И. Как это поправить? Спасибо.