Включение категорий в результаты поиска

5 февр. 2013 г., 07:55:14
Просмотры: 25.5K
Голосов: 10

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

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

Есть ли у кого-нибудь идеи или может кто-то направить меня в правильном направлении?

0
Все ответы на вопрос 8
0

Используйте get_terms(), тогда вам не понадобится делать кастомный запрос к базе данных.

$terms = get_terms( 'category', array(
    'name__like' => $s,
    'hide_empty' => true // Опционально 
) );
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>';
}

Основано на ответе birgire на аналогичный вопрос: https://wordpress.stackexchange.com/a/239680/50432

18 сент. 2016 г. 20:35:28
1

Я использую этот код в своем файле search.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>';
}

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

5 февр. 2013 г. 11:37:27
Комментарии

Дэвид, спасибо. Возможно, это то, что мне нужно, но я решил использовать get_term_by и пойти дальше с этим. Я приму ваш ответ.

Yaniv Kossas Yaniv Kossas
5 февр. 2013 г. 19:17:56
0

Я создал страницу с пользовательскими результатами поиска, которая сопоставляет ключевое слово(а) с категориями, записями, пользовательскими типами записей (CPT)...

Вот код для категорий (он также отображает поле ACF категории для изображений):

<?php
    // категории записей в результатах
    $terms = get_terms( 'post', array(
        'name__like' => $s,
        'hide_empty' => false // Необязательно
    ) );
?>
<?php
// список категорий записей в результатах
if ( count($terms) > 0 ) {
    echo '<div class="sr-categories">';
    echo '<h3 class="search-title">Результаты по категориям</h3>';
?>
<div class="posts-wrap posts-layout-default  row">
    <?php
        foreach ( $terms as $term ) { ?>

        <?php
            echo '<article class="sub-cat-row col-md-4 col-sm-6 col-xs-6 col-xxs-12">';
            echo '<a href="' . esc_url( get_term_link( $term ) ) . '" title="' . esc_attr( $term->name ) . '">';

            $taximg_id = get_field('image', $term);
            $taxsize = "grid-image"; // (thumbnail, medium, large, full или пользовательский размер)
            $taximage = wp_get_attachment_image_src( $taximg_id, $taxsize );

            if($taximg_id) { ?>
                <img src="<?php echo $taximage[0]; ?>" alt="" class="img-responsive" />
            <?php } else { ?>
                <img src="<?php echo get_stylesheet_directory_uri(); ?>/assets/images/default-image-600x400.png" alt="" title="" />
            <?php }

            echo '<div class="sc-title text-center">' . esc_html( $term->name ) . '</div></a>';
            echo '</article>';

            //get_template_part('template-parts/loop/content','listevents');
            wp_reset_postdata();
        }

     ?>
</div>
<?php echo '</div>'; // конец sr-events
} else {
    echo 'Категории событий не найдены';
}
?>
14 сент. 2018 г. 16:59:34
1

Очевидно, это возможно. Если у вас используется тема TwentyTwelve, вам нужно отредактировать файл search.php. Там вы найдете цикл:

<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>

Итак, цикл использует post_format(). Поэтому вам нужно отредактировать content.php. Там вы найдете следующее:

<?php if ( is_search() ) : // Отображаем только краткое описание для поиска ?>
<div class="entry-summary">
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->

Просто замените это на:

<?php if ( is_search() ) : // Отображаем только краткое описание для поиска ?>
<div class="entry-summary">
<?php the_category(); ?><br/>
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->

Если всё пойдет правильно, то это выведет категорию, связанную с результатом поиска. Но только если всё пойдет так, как мы хотим. :)

5 февр. 2013 г. 11:06:07
Комментарии

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

Yaniv Kossas Yaniv Kossas
5 февр. 2013 г. 19:13:21
0

Основываясь на ответе @PhilOwen, я добавил следующий код в начало файла темы search.php:

// категории записей в результатах поиска
$terms = get_terms( 'taxonomy-goes-here', array(
  'name__like' => $s,
  'hide_empty' => false // Необязательно
) );

if ( count($terms) > 0 ) {
  foreach ( $terms as $term ) {
    echo '<h2><a href="' . esc_url( get_term_link( $term ) ) . '" title="' . esc_attr( $term->name ) . '">';
    echo esc_html( $term->name );
    echo '</a></h2>';
  }
}

Я считаю, что часто имеет смысл показывать совпадения таксономий (если они есть) выше отдельных элементов, так как они находятся выше в иерархии данных.

11 апр. 2019 г. 21:58:19
0

Я нашел лучший способ и хотел поделиться не нужно использовать $wpdb этот код работает у меня:

$val = get_search_query(); // Получаем поисковый запрос
$categories = get_terms( ['taxonomy' => 'product_cat'] ); // Получаем все категории товаров
    foreach($categories as $cat){ // Перебираем категории
    if (stristr($cat->name , $val)){ // Проверяем, содержится ли поисковый запрос в названии категории (без учета регистра)
        echo '<tr><td><a href="'.get_term_link( $cat ).'" >' .$cat->name.'</a></td></tr>'; // Выводим ссылку на категорию
        break; // Прерываем цикл после первого совпадения
}

Этот код ищет в категориях товаров, и совпадение не обязательно должно быть точным

29 дек. 2021 г. 18:13:38
0

Я видел некоторые ответы с использованием get_terms(), что неплохо, но я предпочитаю обращаться к источнику, поэтому вот что я придумал, используя класс WP_Term_Query из исходного кода @ https://github.com/WordPress/wordpress-develop/blob/6.7/src/wp-includes/class-wp-term-query.php#L96:

$product_category_query = new WP_Term_Query(array(
  'number'   => 10,
  'orderby'  => 'name',
  'order'    => 'ASC',
  'search'   => $search_input_value,
  'taxonomy' => array('product_cat'),
));

Затем можно пройтись по результатам в цикле:

<ul>
  <?php foreach($product_category_query->terms as $term) : ?>
    <li><a href="<?php echo get_term_link($term); ?>"><?php echo $term->name; ?></a></li>
  <?php endforeach; ?>
</ul>
20 февр. 2025 г. 22:34:58
2
-1

ПРОБЛЕМА: Начиная с марта 2022 года WordPress не осуществляет поиск по категориям или меткам.

РЕШЕНИЕ/ОБХОДНОЙ ПУТЬ: Используйте плагин для включения поиска по категориям или меткам. Я протестировал это с бесплатной версией плагина Relevanssi. https://www.relevanssi.com/features/. Другие плагины также могут работать.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не связан с Relevanssi или любым другим разработчиком плагинов для поиска в WordPress.

12 мар. 2022 г. 21:13:57
Комментарии

WordPress никогда не выполнял поиск по названиям или описаниям категорий, меток (или любого другого типа таксономий). Именно об этом вопрос. Ответ "используйте плагин" очевиден, но он мало что добавляет и не соответствует духу ожидаемых ответов на этом сайте.

Mark Kaplun Mark Kaplun
13 мар. 2022 г. 07:43:47

Использование плагина для такой задачи — это перебор. Вместо этого следует использовать WP_Term_Query или get_terms().

cfx cfx
20 февр. 2025 г. 22:35:47