За последние 24 часа нас посетили 18927 программистов и 1605 роботов. Сейчас ищут 1147 программистов ...

Несовпадение регистра при выводе результата поиска

Тема в разделе "PHP для новичков", создана пользователем Sega1821, 7 мар 2024.

  1. Sega1821

    Sega1821 Активный пользователь

    С нами с:
    22 мар 2021
    Сообщения:
    4
    Симпатии:
    0
    Здравствуйте, пытаюсь сделать поиск в wordpress, в целом работает хорошо, но есть проблема, если я ищу слово с большой буквы, а в искомом тексте она маленькая, то выводятся первые 50 слов вместо искомой фразы. Если регистр совпадает, то всё нормально, выводится нужный отрывок текста

    Страница вывода результатов поиска:
    PHP:
    1.   <div class="textforsearch">
    2.     <?php
    3.     // Получаем содержимое записи
    4.     $content = get_the_content();
    5.  
    6.     // Получаем поисковой запрос
    7.     $search_query = get_search_query();
    8.  
    9.     // Используем регулярное выражение для извлечения содержимого тега [vc_column_text]
    10.     $pattern_vc_column = '/\[vc_column_text[^\]]*\](.*?)\[\/vc_column_text\]/is';
    11.    
    12.     // Проверяем каждое совпадение
    13.     preg_match_all($pattern_vc_column, $content, $matches_vc_column, PREG_SET_ORDER);
    14.  
    15.     // Массив для отслеживания уже выведенных строк
    16.     $displayed_lines = array();
    17.  
    18.     // Перебираем найденные совпадения в [vc_column_text]
    19.     foreach ($matches_vc_column as $match_vc_column) {
    20.         // Разбиваем текст из [vc_column_text] на строки
    21.         $lines = explode("\n", strip_tags($match_vc_column[1]));
    22.  
    23.         // Перебираем строки
    24.         foreach ($lines as $line) {
    25.             // Если найденный текст содержит ключевое слово и еще не был выведен, выводим его
    26.             if (stripos($line, $search_query) !== false && !in_array($line, $displayed_lines)) {
    27.                 echo wpautop($line);
    28.                 // Добавляем строку в массив выведенных
    29.                 $displayed_lines[] = $line;
    30.             }
    31.         }
    32.     }
    33.  
    34.     // Пробуем старый метод поиска в атрибуте text=""
    35.     $pattern_text_attribute = '/\btext="([^"]*'. preg_quote($search_query, '/') .'[^"]*)"/i';
    36.     if (preg_match_all($pattern_text_attribute, $content, $matches_text_attribute)) {
    37.         // Перебираем найденные совпадения в text=""
    38.         foreach ($matches_text_attribute[1] as $match_text_attribute) {
    39.             // Если найденный текст еще не был выведен, выводим его
    40.             if (!in_array($match_text_attribute, $displayed_lines)) {
    41.                 echo wpautop($match_text_attribute);
    42.                 // Добавляем строку в массив выведенных
    43.                 $displayed_lines[] = $match_text_attribute;
    44.             }
    45.         }
    46.     }
    47.  
    48.     // Если нет совпадений в [vc_column_text] и text="", выводим обычный фрагмент текста
    49.     if (empty($matches_vc_column) && empty($matches_text_attribute[1])) {
    50.         echo wpautop(wp_trim_words(strip_tags($content), 50)); // Ограничиваем вывод до 50 слов
    51.     }
    52.     ?>
    53.        
    54.        
    55.        
    56. </div>

    Так же есть ещё одна функция, возможно проблема и в ней (functions.php)

    PHP:
    1. function cf_search_where($where) {
    2.     global $wpdb;
    3.  
    4.     if (is_search()) {
    5.         $search_query = get_search_query();
    6.  
    7.         // Добавляем символы % вокруг всего поискового запроса
    8.         $modified_query = '%' . esc_sql($wpdb->esc_like($search_query)) . '%';
    9.  
    10.         // Добавляем условие поиска для класса .opisus в поле post_content
    11.         $where = preg_replace(
    12.             "/\(\s*" . $wpdb->posts . ".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
    13.             "(" . $wpdb->posts . ".post_title LIKE '$modified_query') OR (" . $wpdb->postmeta . ".meta_value LIKE '$modified_query') OR ((" . $wpdb->posts . ".post_content LIKE '%$modified_query%' OR " . $wpdb->posts . ".ID IN (SELECT post_id FROM " . $wpdb->postmeta . " WHERE meta_key = 'class' AND meta_value LIKE '%opisus%'))) OR (" . $wpdb->posts . ".post_content LIKE '%$search_query%' AND " . $wpdb->posts . ".post_content LIKE '%profil%')",
    14.             $where
    15.         );
    16.     }
    17.  
    18.     return $where;
    19. }
     
  2. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    86
    Симпатии:
    17
    Написать столь сложный функционал и не знать об https://www.php.net/manual/ru/function.strtolower.php
    достаточно странно.

    Можешь модифицировать структуру бд utf8_general_ci и utf8mb4_general_ci, которая не чувствительна к регистру .

    Ну или раз это ВП.. вероятно есть с десяток готовых плагинов
     
  3. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    дак ТС не читатель, он писатель, не смог тему в правильный раздел Wordpress | Форум PHP Программистов | PHP.ru разместить )