Получение только родительских терминов с помощью wp_get_post_terms
У меня есть пользовательский тип записи с иерархическими таксономиями. Например, мой тип записи "project" имеет категории:
A
A.1
B
C
Я пытаюсь получить таксономии для отображения в качестве классов для элементов <li>
каждой записи, но мне нужны только родительские категории верхнего уровня. Для записи, которую я рассматриваю, она относится к категориям A.1 и C, но я хочу получить A и C.
Я использую параметр 'parent' => 0
в аргументах, но он возвращает мне A.1 и C. Я также пробовал использовать 'hide_empty' => 0
, но это не помогло.
Вот мой код:
function project_get_item_classes($post_id = null) {
if ($post_id === null)
return;
$_terms = wp_get_post_terms($post_id, 'construction_type', array( 'parent' => 0, 'hide_empty' => 0 ));
foreach ($_terms as $_term) {
echo " " . $_term->slug;
}
}
Функция wp_get_post_terms
не принимает параметры 'parent'
или 'hide_empty'
в массиве аргументов, только 'orderby'
, 'order'
и 'fields'
, но вы на правильном пути. Просто добавьте условную проверку перед выводом slug:
function project_get_item_classes($post_id = null) {
if ($post_id === null)
return;
$_terms = wp_get_post_terms($post_id, 'construction_type');
foreach ($_terms as $_term) {
if ($_term->parent == 0) //проверяем только родительские термины
echo " " . $_term->slug;
}
}

Спасибо, я перепутал аргументы с другой функцией. Теперь единственная проблема в том, что родительская категория не применяется к дочерней. Например, категория A должна применяться к посту для категории A.1. До этого фрагмента кода категория A.1 применялась, но теперь она просто пустая.

Спасибо помощи от @Bainternet (здесь, а также его вкладу, который привел к ответу на этот вопрос), мне удалось собрать код.
// определение самого верхнего родительского элемента термина
function get_term_top_most_parent($term_id, $taxonomy){
// начинаем с текущего термина
$parent = get_term_by( 'id', $term_id, $taxonomy);
// поднимаемся по иерархии, пока не достигнем термина с parent = '0'
while ($parent->parent != '0'){
$term_id = $parent->parent;
$parent = get_term_by( 'id', $term_id, $taxonomy);
}
return $parent;
}
// после того как у вас есть эта функция, можно просто перебирать результаты, возвращаемые wp_get_object_terms
function project_get_item_classes($taxonomy, $results = 1) {
// получаем термины для текущей записи
$terms = wp_get_object_terms( get_the_ID(), 'work_type' );
// устанавливаем переменные
$top_parent_terms = array();
foreach ( $terms as $term ) {
// получаем верхнего родителя
$top_parent = get_term_top_most_parent( $term->term_id, 'work_type' );
// проверяем, есть ли он уже в массиве, чтобы добавить только один раз
if ( !in_array( $top_parent, $top_parent_terms ) ) {
$top_parent_terms[] = $top_parent;
}
}
// формируем вывод (HTML на ваше усмотрение)
foreach ( $top_parent_terms as $term ) {
echo " " . $term->slug;
}
}
