Категории в результатах поиска

Задался вопросом как вывести в результатах поиска категории в названиях которых есть искомые слова. Яндекс и гугл выдавали только одну статью, которая решала проблему. Воспользовавшись советом и кодом, который был найден, я заметил, что поиск отрабатывает не совсем так как я хотел. Например, если в поисковом запросе было слово состоящее из одной буквы, то в выдачу попадали почти все категории, а точнее те где эта одна буква присутствовала 🙂 и получалось, что поиск был без результатным. Второе, это я заметил сразу, код был стандартным, но не универсальным, не учитывался префикс таблиц в базе данных. Я то заметил и поправил себе, но представляю как многие, кто нашел этот код и вставил себе (особенно новички) и обнаружил, если префикс отличный от wp_, что ничего у него на сайте не изменилось. Какая жалость. Ну и конечно такие фишки, как стоп-слова, тоже не работают. Или при «пустом» запросе, если ввести пробел выводятся термины различных таксономий, помимо категорий — а зачем вообще делать выборку при пустом запросе? или при запросе длиной в одну букву? Что хочет найти пользователь? Не лучше ли вообще не делать такие выборки и не нагружать БД, а выдавать «пусто».

Вы можете вставить код ниже в шаблон вывода результатов поиска (файл search.php), перед началом цикла if(have_posts()), если файла search.php нет, то создаете его. Как создать? Пользуемся поиском 🙁

<?php
$len = 2; // Минимальная длина запроса и слов поиска при разбивке
$search_query = strip_tags(get_search_query( false ));
$search_query = trim($search_query);
if ( iconv_strlen($search_query) > $len ) : // Если пустой поиск или длина меньше $len то не выполняем запрос
  global $wpdb;
  $select = "SELECT DISTINCT t.*, tt.*
  FROM {$wpdb->prefix}terms AS t
  INNER JOIN {$wpdb->prefix}term_taxonomy AS tt
  ON t.term_id = tt.term_id
  WHERE tt.taxonomy IN ('product_cat')"; // 'product_cat' для WC или 'category' для WP
  $first = true;
  foreach ( $search_term as $s ){
    if ( iconv_strlen($s) > $len ) { // искать строки размером 3 (значение меняем в переменной $len) и больше
      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";
  $select .= " LIMIT 15";  // Лимит найденных категорий
  $terms = $wpdb->get_results( $wpdb->prepare( $select, $string_replace ) );
endif;
?>

Представленный код — формирует запрос и ищет нужные названия категорий, а следующий код, выдает результат:

<?php
if ( count($terms) > 0 ) : ?>
  <div class="search-cat">
  <?php
  $image_zagluchka = ''; // путь к вашей картинке заглушки
  foreach ( $terms as $term ) : ?>
    <div class="block-podcategory">
      <a href="<?php echo get_term_link( $term ); ?>" title="<?php echo $term->name; ?>">
        <?php
        $thumbnail_id = get_term_meta( $term->term_id, 'thumbnail_id', true );
        if ( $thumbnail_id ) {
          // получаем URL-адрес изображения близкого к указанному размеру
          $image = wp_get_attachment_image_src( $thumbnail_id, array(40,40) );
          // Вывод через тег img
          echo '<img class="search-img" src="' . $image[0] . '" width="' . $image[1] . '" height="' . $image[2] . '" alt="" />';
        } else if ( $image_zagluchka !== '' {
            echo '<img class="search-img" src="' . $image_zagluchka . '" alt="" />';
          }
        } ?>
        <span class="title-cat"><?php echo $term->name; ?></span>
      </a>
    </div>
  <?php endforeach; ?>
  </div>
<?php endif; ?>

Данный код работает с темами WooCommerce. Стили используйте свои. Если вам нужно искать в теме не с WC, то измените WHERE tt.taxonomy IN (‘product_cat’)» на WHERE tt.taxonomy IN (‘category’)» и все будет работать.

По другим примечаниям я думаю поймете, что и как.

Статья основана на информации расположенной https://opttour.ru/wordpress/kategorii-v-rezultatah-poiska/

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх