2015-01-05 6 views
1

У меня есть обычная таксономия «местоположения», с 3 уровнями: город -> регион -> пригород.Определить самый низкий уровень таксономии

При посещении индивидуального сообщения, отмеченного знаком города, региона и пригорода, я хочу также получить близлежащие посты. Это означает, что другие должности в одном и том же пригороде.

Это дает мне все условия местоположение, назначенные на должность:

$terms = wp_get_post_terms($wp_query->post->ID, 'location'); 

Я обнаружил, что если родитель термина равен 0, это город (верхний уровень).

foreach ($terms as $term) { 
    if ($term->parent == 0) { 

     //$term is a city 

    } 
} 

Мой вопрос: как я могу определить, какой термин является пригородом (самый низкий уровень)?

+0

У меня была идея: использовать атрибут счета для сравнения все условия. Тот, с меньшим использованием, должен быть пригородом. Но что, если в регионе есть только один пригород? оба будут иметь одинаковый счет – Alex

ответ

-1

Вот как работает идентификатор этого термина между родителем, ребенком и внуком. Возьмем, к примеру, у вас есть запись, которая принадлежит всем трем, в вашем вопросе,

город -> область -> пригорода

city будет меньшим номером ID, чем region, который в свою очередь будет имеют идентификатор с более низким номером, чем suburb

С учетом этого, закажите свои условия по ID в обратном порядке, наивысший идентификатор. Посмотрите на wp_get_post_terms. Вы делаете следующее

$terms = wp_get_post_terms(get_queried_object_id(), 'location', array('orderby' => 'id', 'order' => 'DESC')); 

Вы можете получить первый элемент в этом массиве, который будет ваш сроком внучат, или термин глубинного уровня, термин с наибольшим ID

+0

См. мое обновление. Полностью забыл о параметре 'order' и имел синтаксическую ошибку –

+9

Этот ответ неверен, потому что не может быть гарантировано, что более низкие значения в иерархии имеют более высокие идентификаторы, чем их родители. – rocknrollcanneverdie

+3

Неверный ответ!Как писал @rocknrollcanneverdie. – Sevi

1

получил ту же проблему, но был более общим. Ситуация была неизвестной глубиной и несколькими терминами, выбранными на первом уровне. Вот как я его решил:

function get_lowest_taxonomy_terms($terms) { 
    // if terms is not array or its empty don't proceed 
    if (! is_array($terms) || empty($terms)) { 
     return false; 
    } 

    $filter = function($terms) use (&$filter) { 

     $return_terms = array(); 
     $term_ids = array(); 

     foreach ($terms as $t){ 
      $term_ids[] = $t->term_id; 
     } 

     foreach ($terms as $t) { 
      if($t->parent == false || !in_array($t->parent,$term_ids)) { 
       //remove this term 
      } 
      else{ 
       $return_terms[] = $t; 
      } 
     } 

     if(count($return_terms)){ 
      return $filter($return_terms); 
     } 
     else { 
      return $terms; 
     } 

    }; 

    return $filter($terms); 
} 

Функция возвращает термины с самым низким уровнем с помощью рекурсии. На каждой итерации он удаляет условия без родителей (уровень 1) и термины с родителями, которые больше не включаются в набор отфильтрованных терминов (уровни> 1). Рекурсия заканчивается пустым множеством и возвращает результат предыдущей итерации.

Мой призыв бы выглядел следующим образом:

get_lowest_taxonomy_terms(get_the_terms(get_the_ID(), 'item_location')); 
3

Я решил эту проблему путем подсчета предков каждого термина.

С помощью функции get_ancestors() вы можете получить массив, содержащий родителей от самого низкого до самого высокого в иерархии.

Это работает для меня:

$terms = wp_get_post_terms(get_queried_object_id(), 'location', array('orderby' => 'id', 'order' => 'DESC')); 

$deepestTerm = false; 
$maxDepth = -1; 

foreach ($terms as $term) { 
    $ancestors = get_ancestors($term->term_id, 'location'); 
    $termDepth = count($ancestors); 

    if ($termDepth > $maxDepth) { 
     $deepestTerm = $term; 
     $maxDepth = $termDepth; 
    } 
} 

echo '<pre>'; 
print_r($deepestTerm); 
echo '</pre>'; 
Смежные вопросы