WP_Query таксономическая часть запроса по слагу

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

У меня проблема с фильтрацией постов по таксономии.
У меня есть собственная таксономия под названием ‘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, и оптимизируете заголовки и метаописания для ваших постов. Это поможет поисковым системам лучше индексировать ваш контент и повысит шанс на его нахождение по различным ключевым словам.

Заключение

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

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

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

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