Отобразить заголовки постов, соответствующие строке в содержании поста.

Вопрос или проблема

Я пытаюсь просматривать содержимое текущего поста и искать любые строки, которые совпадают с заголовком любого типа пользовательского поста ‘term’.

Идея заключается в том, что любые термины, которые у нас есть в описании поста, будут прямо здесь для пользователя, если ему нужно уточнение. Этот скрипт работает идеально, когда я вставляю любую строку для переменной $content_search, но перестает работать правильно, когда я устанавливаю

$content_search = get_the_content();

Он выводит совпадающие термины, но также несколько на вид случайных.

Я смотрю на этот блок кода уже довольно долгое время и никак не могу понять, в чем проблема. Любая помощь будет отличной!

                    <?php

                        // поиск совпадающих терминов из глоссария, которые находятся в описании

                        $content_search = get_the_content();
                        $content_search = strtolower($content_search);

                        $args_terms = array(
                            'post_type' => 'term',
                            'orderby'   => 'title',
                            'posts_per_page' => -1
                            );

                        $glossary_terms = new WP_Query($args_terms);

                        echo '<h3>Термины, используемые в этом занятии:</h3>';

                        while ($glossary_terms->have_posts()){
                            $glossary_terms->the_post();
                            $tt_title = strtolower(get_the_title());

                            if (strpos($content_search, $tt_title) !== false){

                                $tt_title = ucwords($tt_title);
                                $tt_content = strip_tags(get_the_content());
                                echo do_shortcode('[tooltip tooltip_title="' . $tt_content . '"]' . $tt_title . '[/tooltip]');
                                echo ' | ';
                                }
                            }

                            wp_reset_postdata();
                        ?>

Проблема в том, что вы ищете строку заголовка во всем содержимом целиком, а не слово за словом.
Например, если ваш заголовок ‘blog’, а в содержимом есть слово ‘blogging’, оно все равно будет совпадать и извлекать ‘blog’ из ‘blogging’. Вы можете сравнивать их слово за словом, разбив содержимое следующим образом:

<?php

                        // поиск совпадающих терминов из глоссария, которые находятся в описании

                        $content_search = get_the_content();
                        $content_search = strtolower($content_search);

                        $args_terms = array(
                            'post_type' => 'term',
                            'orderby'   => 'title',
                            'posts_per_page' => -1
                            );

                        $glossary_terms = new WP_Query($args_terms);

                        echo '<h3>Термины, используемые в этом занятии:</h3>';

                        while ($glossary_terms->have_posts()){
                            $glossary_terms->the_post();
                            $tt_title = strtolower(get_the_title());

                        $content = explode(" ", $content_search);

                        foreach($content as $term){

                            if ($term === $tt_title){

                                $tt_title = ucwords($tt_title);
                                $tt_content = strip_tags(get_the_content());
                                echo do_shortcode('[tooltip tooltip_title="' . $tt_content . '"]' . $tt_title . '[/tooltip]');
                                echo ' | ';
                                }
}
                            }

                            wp_reset_postdata();
                        ?>

Ответ или решение

Отображение заголовков постов, соответствующих строке в содержимом поста

Вы сталкиваетесь с проблемой поиска заголовков постов типа ‘term’, которые присутствуют в содержимом текущего поста. Сложность заключается в том, что ваша текущая реализация находит частичные совпадения, например, наличие слова ‘blog’ в слове ‘blogging’, что приводит к неверным результатам. Решением является сравнение каждого слова в содержании поста с заголовками постов ‘term’ точным образом, поддерживая строгую семантику совпадений.

Решение:

Для исправления данной проблемы, необходимо разбить содержимое текущего поста на отдельные слова и проверить каждое из них на точное совпадение с заголовками постов ‘term’. В этом случае мы будем избегать частичных совпадений и добьемся более точных результатов.

Пример кода:

<?php

// Получение содержимого текущего поста
$content_search = get_the_content();
$content_search = strtolower($content_search);

// Параметры для получения всех постов типа 'term'
$args_terms = array(
    'post_type' => 'term',
    'orderby' => 'title',
    'posts_per_page' => -1
);

$glossary_terms = new WP_Query($args_terms);

echo '<h3>Термины, используемые в данном уроке:</h3>';

// Разбиение содержимого поста на слова
$content = explode(" ", $content_search);

// Перебор всех 'term' постов и поиск точных совпадений
while ($glossary_terms->have_posts()) {
    $glossary_terms->the_post();
    $tt_title = strtolower(get_the_title());

    foreach ($content as $term) {
        if ($term === $tt_title) {
            $tt_title = ucwords($tt_title);
            $tt_content = strip_tags(get_the_content());
            echo do_shortcode('[tooltip tooltip_title="' . $tt_content . '"]' . $tt_title . '[/tooltip]');
            echo ' | ';
        }
    }
}

wp_reset_postdata();
?>

Пояснение:

Этот подход повышает точность совпадений между заголовками и содержанием, поскольку текст текущего поста вначале превращается в массив слов. Затем проверка выполняется с учетом строгой семантической точности без появления случайных совпадений.

Таким образом, с использованием данной стратегии ваше приложение будет отображать корректные термины, позволяя пользователям легко находить необходимые им пояснения. Надеемся, что данное руководство поможет вам решить поставленную задачу.

Оцените материал
Добавить комментарий

Капча загружается...