Подсветка поиска на 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;
}

Код работает, но не корректно при некоторых словах, например - отработало хорошо

image

А при некоторых вхождения вот такая картина image

Кто знает, подскажите в чем проблема, или в какую сторону копать.


Ответы (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;
    
}
→ Ссылка