Вопрос или проблема
Я пытаюсь просматривать содержимое текущего поста и искать любые строки, которые совпадают с заголовком любого типа пользовательского поста ‘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();
?>
Пояснение:
Этот подход повышает точность совпадений между заголовками и содержанием, поскольку текст текущего поста вначале превращается в массив слов. Затем проверка выполняется с учетом строгой семантической точности без появления случайных совпадений.
Таким образом, с использованием данной стратегии ваше приложение будет отображать корректные термины, позволяя пользователям легко находить необходимые им пояснения. Надеемся, что данное руководство поможет вам решить поставленную задачу.