Вопрос или проблема
У меня проблема с фильтрацией постов по таксономии.
У меня есть собственная таксономия под названием ‘actors’, и пример слага – ‘david-hasselhoff’. Проблема в том, что пост находится, когда я ищу ‘david hasselhof’, но не находится с ‘david’ или ‘hasselhof’.
Вот мой код на данный момент
$args = [
'post_type' => 'movies',
'tax_query' => [
[
'taxonomy' => 'actors',
'field' => 'slug',
'terms' => $keyword,
]
]
];
Вы можете использовать приведенный ниже код для поиска в таксономии. Сначала, используя name__like
в get_terms
, это вернет все идентификаторы терминов, которые содержат $keyword, затем используйте эти идентификаторы в wp_query
.
$termIds = get_terms([
'name__like' => $keyword,
'fields' => 'ids'
]);
$args = [
'post_type' => 'movies',
'tax_query' => [
[
'taxonomy' => 'actors',
'field' => 'id',
'terms' => $termIds,
]
]
];
$query_loop = new WP_Query($args);
Ответ или решение
Для решения проблемы фильтрации постов по пользовательской таксономии в WordPress, рассмотрим использование класса WP_Query
в сочетании с функцией get_terms
. Ваша задача заключается в том, чтобы обеспечить поиск записей, основываясь на частичном совпадении слагов таксономий, таких как «david-hasselhoff». По умолчанию, WP_Query
не работает с частичными совпадениями для слагов, поэтому необходимо применить дополнительные механизмы.
Вот пошаговый подход к решению вашей задачи:
1. Получение идентификаторов терминов с использованием get_terms
Для начала, мы можем использовать функцию get_terms
с параметром name__like
. Эта функция вернёт идентификаторы терминов, для которых название содержит искомое слово. Как следует из вашего запроса, вы хотите искать только по слагам, но так как слаги в основном представляют собой более сложную строку, использование названий терминов для поиска может быть более эффективным.
Пример кода для получения идентификаторов терминов:
$termIds = get_terms([
'taxonomy' => 'actors',
'name__like' => $keyword, // замените $keyword на ваш поисковый запрос
'fields' => 'ids',
'hide_empty' => false, // или true, в зависимости от ваших требований
]);
2. Подготовка и выполнение запроса WP_Query
Теперь, когда вы получили идентификаторы терминов, вы можете использовать их для фильтрации постов в вашем запросе WP_Query
. Обратите внимание, что будьте готовы к ситуации, когда не будет найдено никаких терминов. Для этого необходимо проверить, не пуст ли массив идентификаторов терминов:
$args = [
'post_type' => 'movies',
'tax_query' => [
[
'taxonomy' => 'actors',
'field' => 'id',
'terms' => $termIds,
]
]
];
$query_loop = new WP_Query($args);
3. Обработка результатов
После выполнения запроса вы сможете обработать результаты, как вам нужно:
if ($query_loop->have_posts()) {
while ($query_loop->have_posts()) {
$query_loop->the_post();
// Вставьте здесь ваш код вывода постов
}
} else {
echo 'Нет результатов для данного запроса.';
}
// Восстановление глобальных переменных после запроса
wp_reset_postdata();
4. Оптимизация SEO
Чтобы улучшить видимость вашего контента и SEO, убедитесь, что используете структурированные данные, такие как schema markup
, и оптимизируете заголовки и метаописания для ваших постов. Это поможет поисковым системам лучше индексировать ваш контент и повысит шанс на его нахождение по различным ключевым словам.
Заключение
Данный подход позволит вам более гибко подходить к фильтрации постов по пользовательским таксономиям, учитывая частичное совпадение слагов и названий терминов. Используя описанные методы, вы сможете улучшить пользовательский опыт на вашем сайте и увеличить вероятность того, что пользователи найдут нужный им контент.
Не забывайте тестировать ваш код на различных кейсах, чтобы убедиться, что всё работает корректно в разных условиях, что также является важным аспектом для поддержки и оптимизации вашего проекта.