Здравствуйте, пытаюсь сделать поиск в wordpress, в целом работает хорошо, но есть проблема, если я ищу слово с большой буквы, а в искомом тексте она маленькая, то выводятся первые 50 слов вместо искомой фразы. Если регистр совпадает, то всё нормально, выводится нужный отрывок текста Страница вывода результатов поиска: PHP: <div class="textforsearch"> <?php // Получаем содержимое записи $content = get_the_content(); // Получаем поисковой запрос $search_query = get_search_query(); // Используем регулярное выражение для извлечения содержимого тега [vc_column_text] $pattern_vc_column = '/\[vc_column_text[^\]]*\](.*?)\[\/vc_column_text\]/is'; // Проверяем каждое совпадение preg_match_all($pattern_vc_column, $content, $matches_vc_column, PREG_SET_ORDER); // Массив для отслеживания уже выведенных строк $displayed_lines = array(); // Перебираем найденные совпадения в [vc_column_text] foreach ($matches_vc_column as $match_vc_column) { // Разбиваем текст из [vc_column_text] на строки $lines = explode("\n", strip_tags($match_vc_column[1])); // Перебираем строки foreach ($lines as $line) { // Если найденный текст содержит ключевое слово и еще не был выведен, выводим его if (stripos($line, $search_query) !== false && !in_array($line, $displayed_lines)) { echo wpautop($line); // Добавляем строку в массив выведенных $displayed_lines[] = $line; } } } // Пробуем старый метод поиска в атрибуте text="" $pattern_text_attribute = '/\btext="([^"]*'. preg_quote($search_query, '/') .'[^"]*)"/i'; if (preg_match_all($pattern_text_attribute, $content, $matches_text_attribute)) { // Перебираем найденные совпадения в text="" foreach ($matches_text_attribute[1] as $match_text_attribute) { // Если найденный текст еще не был выведен, выводим его if (!in_array($match_text_attribute, $displayed_lines)) { echo wpautop($match_text_attribute); // Добавляем строку в массив выведенных $displayed_lines[] = $match_text_attribute; } } } // Если нет совпадений в [vc_column_text] и text="", выводим обычный фрагмент текста if (empty($matches_vc_column) && empty($matches_text_attribute[1])) { echo wpautop(wp_trim_words(strip_tags($content), 50)); // Ограничиваем вывод до 50 слов } ?> </div> Так же есть ещё одна функция, возможно проблема и в ней (functions.php) PHP: function cf_search_where($where) { global $wpdb; if (is_search()) { $search_query = get_search_query(); // Добавляем символы % вокруг всего поискового запроса $modified_query = '%' . esc_sql($wpdb->esc_like($search_query)) . '%'; // Добавляем условие поиска для класса .opisus в поле post_content $where = preg_replace( "/\(\s*" . $wpdb->posts . ".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(" . $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%')", $where ); } return $where; }
Написать столь сложный функционал и не знать об https://www.php.net/manual/ru/function.strtolower.php достаточно странно. Можешь модифицировать структуру бд utf8_general_ci и utf8mb4_general_ci, которая не чувствительна к регистру . Ну или раз это ВП.. вероятно есть с десяток готовых плагинов
дак ТС не читатель, он писатель, не смог тему в правильный раздел Wordpress | Форум PHP Программистов | PHP.ru разместить )