В WordPress, чтобы получить термины с помощью get_terms()
и фильтровать их по типу записей (post_type
), вам нужно использовать дополнительный SQL-запрос, так как сам get_terms()
напрямую не предоставляет опции для фильтрации по типу записей.
Однако вы можете использовать параметр meta_query
или работать через связь с записями. Вот пошаговый способ:
Пример получения терминов, у которых есть записи определённого post_type
- Шаг 1: Получение ID записей определённого типа Сначала получаем ID записей, относящихся к нужному типу.
- Шаг 2: Получение терминов для этих записей После получения ID записей можно фильтровать термины.
Вот пример кода:
function get_terms_with_post_type($taxonomy, $post_type) {
global $wpdb;
// Запрос для получения терминов, связанных с постами определённого типа
$query = $wpdb->prepare("
SELECT t.term_id
FROM {$wpdb->terms} AS t
INNER JOIN {$wpdb->term_taxonomy} AS tt ON t.term_id = tt.term_id
INNER JOIN {$wpdb->term_relationships} AS tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
INNER JOIN {$wpdb->posts} AS p ON p.ID = tr.object_id
WHERE tt.taxonomy = %s
AND p.post_type = %s
AND p.post_status = 'publish'
GROUP BY t.term_id
", $taxonomy, $post_type);
// Получение ID терминов
$term_ids = $wpdb->get_col($query);
// Получение объектов терминов
if (!empty($term_ids)) {
return get_terms([
'taxonomy' => $taxonomy,
'include' => $term_ids,
]);
}
return [];
}
// Использование функции
$terms = get_terms_with_post_type('category', 'custom_post_type');
foreach ($terms as $term) {
echo $term->name . '<br>';
}
Объяснение кода:
$wpdb->prepare
: Используется для безопасного выполнения SQL-запросов с параметрами.- SQL-запрос:
- Соединяет таблицы терминов, таксономий, отношений терминов и постов.
- Фильтрует посты по статусу (
publish
) иpost_type
. - Группирует результаты по терминам, чтобы не было дубликатов.
get_terms()
: Получает термины по списку ID, найденных в SQL-запросе.
Альтернативный способ: WP_Query + get_terms
Если SQL-запросы нежелательны, можно использовать WP_Query
для фильтрации записей по post_type
, а затем получить термины из записей. Это менее эффективно:
function get_terms_with_wp_query($taxonomy, $post_type) {
$query = new WP_Query([
'post_type' => $post_type,
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids', // Возвращаем только ID
]);
if ($query->have_posts()) {
$post_ids = $query->posts;
return wp_get_object_terms($post_ids, $taxonomy);
}
return [];
}
// Использование
$terms = get_terms_with_wp_query('category', 'custom_post_type');
foreach ($terms as $term) {
echo $term->name . '<br>';
}
Этот метод не требует прямых SQL-запросов, но может быть медленнее, если у вас много записей.
Оба подхода дадут вам термины, связанные с записями конкретного типа.