Подсветка поиска на WP
Нашел пример поиска на ajax, вот
Хочу сделать, чтобы слово которое ищу подсвечивалось в заголовке или тексте. С заголовком все хорошо. Но вот с подсветкой слова в статье проблемы.
Если выводить описание the_excerpt() - то слово не всегда есть в кратком описание, поэтому отпадает вариант. Использую get_the_content(). В данной части прокомментировал код для ясности своих действий
$args = array(
'post_type' => 'news',
'post_status' => 'publish',
'order' => 'DESC',
'orderby' => 'date',
's' => $_POST['term'],
'posts_per_page' => -1
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post(); ?>
<li class="ajax-search__item">
<a href="<?php the_permalink(); ?>" class="ajax-search__link">
<p>
<?php
$title = get_the_title();
$keys = explode(" ",$_POST['term']);
$title = preg_replace('/('.implode('|', $keys) .')/iu', '<strong class="search-excerpt">\0</strong>', $title);
echo $title;
?>
</p>
</a>
<div class="ajax-search__excerpt">
<?php the_excerpt();
$title = get_the_content(); // получаю текст статьи
$keys = explode(" ",$_POST['term']); // получаю значение из поля, если пробел делаю массив
$title = preg_replace('/('.implode(',', $keys) .')/iu', '<span class="search-excerpt">\0</span>', $title); // нахожу вхождение и обворачиваю в span
$fidme = '<span class="search-excerpt">'; // флаг совпадения
$pos = mb_strpos($title,$fidme); // нахожу позицию первого совпадения
$result = mb_substr($title, $pos, 300); // от совпадения отчитываю 300 позиций
echo $result; // вывожу результат
?>
</div>
</li>
<?php }
} else { ?>
<li class="ajax-search__item">
<div class="ajax-search__not-found">Ничего не найдено</div>
</li>
<?php }
exit;
}
Код работает, но не корректно при некоторых словах, например - отработало хорошо
А при некоторых вхождения вот такая картина

Кто знает, подскажите в чем проблема, или в какую сторону копать.
Ответы (1 шт):
Автор решения: Александр
→ Ссылка
Данную реализацию использую в проекте.
$args = array(
'post_type' => 'news',
'post_status' => 'publish',
'order' => 'DESC',
'orderby' => 'date',
's' => $_POST['term'],
'posts_per_page' => -1
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post(); ?>
<li class="ajax-search__item">
<a href="<?php the_permalink(); ?>" target="_blank" class="ajax-search__link">
<div class="wrap__search">
<div class="wrap__search-img">
<img src="<?php echo get_the_post_thumbnail_url(get_the_ID(), 'medium'); ?>" alt="<?php the_title(); ?>">
</div>
<div class="wrap__search-content">
<p>
<?php
$title = get_the_title();
$keys = explode(" ",$_POST['term']);
$title = preg_replace('/('.implode('|', $keys) .')/iu', '<span class="search-excerpt">\0</span>', $title);
echo $title;
?>
</p>
<div class="blog__date"><?php the_date('d.m.Y'); ?></div>
<div class="ajax-search__excerpt">
<?php
$title = get_the_content();
$keys = explode(" ",$_POST['term']);
$title = preg_replace('/('.implode(',', $keys) .')/iu', '<span class="search-excerpt">\0</span>', $title);
$titleTags = strip_tags($title, '<span>');
$fidme = '<span class="search-excerpt">';
$pos = mb_strpos($titleTags,$fidme);
$result = mb_substr($titleTags, $pos, 300);
echo $result;
?>
</div>
</div>
</div>
</a>
</li>
<?php }
} else { ?>
<li class="ajax-search__item">
<div class="ajax-search__not-found">Ничего не найдено</div>
</li>
<?php }
exit;
}