Вопрос или проблема
У меня возникают трудности с получением набора выбранных терминов в пользовательской таксономии, представленных определенным образом.
У меня есть иерархическая таксономия «места» и запись с отмеченными терминами:
England (x)
- London (x)
- Venue1 (x)
France (x)
- Paris (x)
- Venue2
Germany
- Berlin (x)
- Venue3 (x)
Мне нужно вывести:
myPostTitle : Venue1 (London - England)
Paris (France)
Venue3 (Berlin)
Моя проблема в том, что я не могу найти функцию, которая возвращала бы отмеченные термины таким образом, чтобы отражались иерархические отношения. Мне нужно иметь возможность определить:
- Какие термины являются фактическими «местами» (самые «низкие» отмеченные дети в каждой из иерархий).
- Каких родителей и бабушек и дедушек этих «последних детей» включать.
Я вне цикла и предпочел бы не запускать setup_postdata(). У меня есть ID записи.
Сомневаюсь, что вы найдете функцию, которая создала бы именно тот вывод, который вы используете, поэтому, вероятно, вам потребуется два вложенных вызова get_terms()
. Обычно я избегаю использования большинства других плагинов, связанных с таксономией, в пользу get_terms. Большинство других функций являются обертками для этой.
Вот псевдокод того, что бы я сделал:
<?php
// Получить все термины верхнего уровня, то есть те, у которых нет родителя
$top_level_terms = get_terms( 'my_taxonomy', array( 'parent' => 0 ) );
foreach( $top_level_terms as $top_term ) {
// получить дочерние термины. используйте parent для прямых потомков или child_of для всех потомков
$child_terms = get_terms( 'my_taxonomy', array( 'child_of' => $top_term->term_id ));
// перечислить родительский термин
printf(
'<a href="https://wordpress.stackexchange.com/questions/81498/%1$s">%2%s</a> (',
esc_url( get_term_link( $top_term->term_id ) ),
esc_attr( $top_term->name )
);
// перечислить все дочерние термины
foreach ( $child_terms as $child_term ) {
printf(
'<a href="https://wordpress.stackexchange.com/questions/81498/%1$s">%2%s</a>, ',
esc_url( get_term_link( $child_term->term_id ) ),
esc_attr( $child_term->name )
);
}
echo ')';
}
Этот код не протестирован и наверняка потребует от вас некоторых дополнительных аргументов, но, надеюсь, это поможет вам начать.
Ответ или решение
Конечно, давайте углубимся в решение вашей задачи с точки зрения IT и программирования на WordPress. Ваша цель — извлечь иерархические термины таксономии для конкретного поста и организовать их в определенном формате. Работая с WordPress, особенно с кастомными таксономиями, важно понимать существующие функции и подходы для эффективного достижения вашей цели.
Формулировка проблемы
У вас есть таксономия "места", которая включает вложенные термины, такие как "Англия", "Лондон", и "Место1". Вам нужно вывести эти термины для поста в формате:
myPostTitle : Venue1 (London - England)
Paris (France)
Venue3 (Berlin)
Решение
Для решения этой задачи мы будем использовать API WordPress, включая функцию get_terms()
, которая наиболее подходит для манипулирования таксономиями. Пример кода на PHP поможет вам в этом:
<?php
// Устанавливаем необходимые переменные
$post_id = 123; // ID вашего поста
$taxonomy = 'places'; // Ваша таксономия
// Получаем все связанные термины для указанного поста
$terms = wp_get_post_terms($post_id, $taxonomy);
// Функция для получения имен родителей
function get_term_hierarchy($term, $taxonomy) {
$parents = array();
while ($term->parent != 0) {
$term = get_term($term->parent, $taxonomy);
$parents[] = $term;
}
return array_reverse($parents);
}
// Формируем вывод
$output = '';
foreach ($terms as $term) {
$parents = get_term_hierarchy($term, $taxonomy);
// Определяем, является ли текущий термин самым последним в иерархии
$is_leaf = empty(term_children($term->term_id, $taxonomy));
if ($is_leaf) {
$output .= $term->name;
foreach ($parents as $parent) {
$output .= ' (' . $parent->name;
}
$output .= str_repeat(')', count($parents)) . "\n";
}
}
if (!empty($output)) {
echo trim($output);
}
?>
Объяснение
-
Получение терминов поста: Используя
wp_get_post_terms()
, мы извлекаем все термины, связанные с данным постом и определённой таксономией. -
Определение иерархии: Вспомогательная функция
get_term_hierarchy
генерирует массив предков каждого термина. Это позволяет нам эффективно произвести вывод в требуемом формате. -
Проверка на наличие дочерних элементов: Используя
term_children()
, мы проверяем, является ли термин "листом" в иерархическом дереве. -
Форматирование вывода: Развернутый формат обозначает термины и их родителей в нужной последовательности.
Оптимизация SEO и улучшение читаемости
Такой подход помогает не только программно решить вашу задачу, но и улучшает читаемость кода, делая его более понятным для дальнейших модификаций. Помните, что корректное использование семантической структуризации иерархий может положительно влиять на SEO вашего сайта, поскольку поисковые системы ценят хорошо структурированные данные.
В заключение, данный код не только решает текущую задачу, но и предоставляет гибкую основу для дальнейших модификаций, отвечающих вашим специфическим требованиям. Убедитесь, что адаптируете код под ваши специфические нужды и тестируете его в среде разработчика, актуальной для вашего сайта.