У меня есть иерархическая таксономия под названием «географические местоположения». Он содержит континенты на первом уровне, а затем страны для каждого из них. Пример :
Europe
- Ireland
- Spain
- Sweden
Asia
- Laos
- Thailand
- Vietnam
и т.п.
Используя get_terms(), мне удалось вывести полный список терминов, но континенты перепутались со странами в одном большом плоском списке.
Как я могу вывести иерархический список, как указано выше?
В случае, если кому-то нужен иерархический КОНТРОЛЬНЫЙ СПИСОК (не вопрос здесь, а связанный с людьми, создающими собственный пользовательский интерфейс для иерархических таксономий), лучшим ответом будет использование wp_terms_checklist() с вашей пользовательской таксономией.
Может ли это быть обращено вспять? Сначала покажите детям..
Это на самом деле очень хорошо. Я бы изменил одну вещь:
$into[$cat->term_id] = $cat;
наличие$into[] = $cat;
идентификатора термина в качестве ключа массива раздражает (вы не можете легко получить первый элемент, используя клавишу 0) и бесполезно (вы уже храните$cat
объект, и вы можете получить идентификатор используяterm_id
имущество.Если, как и я, вы пытаетесь применить эту функцию к подуровню категорий, вам нужно будет передать идентификатор уровня, на котором вы сейчас находитесь, чтобы это сработало. Но работает хорошо, спасибо @popsi.
это работает, спасибо
На самом деле это очень полезно, так как мне нужно иметь настраиваемые ссылки (с параметром GET) для терминов ссылок, что не представляется возможным с помощью wp_list_categories().
Да, этот метод даст больше контроля над вашим выводом. Но вы могли бы найти и заменить на выходе,
wp_list_categories()
чтобы добавить свои параметры GET. Или, что еще лучше, создайте фильтр для функции, чтобы добавить нужные вам биты. Не спрашивайте меня, как вы это делаете, потому что я еще не смог понять это 🙁Я бы предложил использовать обходчик пользовательских категорий
wp_list_categories
, если вы хотите лучше контролировать вывод, это сделает ваш код более пригодным для повторного использования.Привет, Чип, да, «иерархический» по умолчанию имеет значение «истина».
Можете ли вы предоставить ссылку на живой пример вывода?
Комментируя ответ, оставленный почти два года назад? Действительно? На самом деле, это предполагаемый ответ, даже если он сформулирован как вопрос. Должен ли я отредактировать это как утверждение, а не вопрос?
вернет полный список терминов (как указано в ОП), но не иерархический список, показывающий отношения родитель/потомок, как запрошено.
Пожалуйста, объясните, почему это может решить проблему.
Я думаю, логика в том, что это связанная проблема. Я нашел этот пост, пытаясь понять, как получить иерархический контрольный список в стиле категорий, и у меня возник соблазн добавить ответ здесь, когда я понял это. Я не буду, потому что, как вы указываете, это не отвечает OQ.
Используйте
wp_list_categories
с'taxonomy' => 'taxonomy'
аргументом, он создан для создания иерархических списков категорий, но также поддерживает использование пользовательской таксономии.Пример Кодекса:
отображение терминов в пользовательской таксономии
Если список снова выглядит плоским, возможно, вам просто нужно немного CSS, чтобы добавить отступы к спискам, чтобы вы могли видеть их иерархическую структуру.
Я понимаю, что это очень старый вопрос, но если вам нужно создать реальную структуру терминов, это может быть для вас полезным методом:
Использование выглядит следующим образом:
Я не знаю ни одной функции, которая делает то, что вы хотите, но вы можете создать что-то вроде этого:
Я не проверял это, но вы можете видеть, к чему я клоню. Приведенный выше код даст вам только два уровня.
РЕДАКТИРОВАТЬ: ааа, да, вы можете использовать wp_list_categories(), чтобы делать то, что вам нужно.
Вы можете использовать wp_list_categories() с аргументом «таксономия».
Следующий код сгенерирует раскрывающийся список с терминами, но также может сгенерировать любой другой элемент/структуру, отредактировав переменную $outputTemplate и отредактировав строки str_replace:
Я использовал код @popsi, который работал очень хорошо, и сделал его более эффективным и удобным для чтения:
Применение :
Поскольку я искал то же самое, но чтобы получить условия одного поста, наконец, я собрал это, и это работает для меня.
Что он делает:
• получает все термины имени таксономии для определенного поста.
• для иерархической таксономии с двумя уровнями (например, уровень 1: «страна» и уровень 2: «город») создается h4 с уровнем 1, за которым следует список ul уровня 2, и это для всех элементов уровня 1.
• если таксономия не является иерархической, будет создан только ul-список всех элементов. вот код (я пишу его для себя, поэтому я старался быть как можно более общим, но…):
Итак, наконец, вы вызываете функцию с этим (очевидно, вы заменяете my_taxonomy на свой):
finishingLister('my_taxonomy');
Я не претендую на то, что это идеально, но, как я уже сказал, это работает для меня.
У меня была эта проблема, и ни один из ответов здесь не помог мне по той или иной причине.
Вот моя обновленная и рабочая версия.
И использование:
Это решение менее эффективно, чем код @popsi, поскольку оно создает новый запрос для каждого термина, но его также проще использовать в шаблоне. Если ваш веб-сайт использует кэширование, вы, как и я, можете не возражать против небольших накладных расходов на базу данных.
Вам не нужно готовить массив, который будет рекурсивно заполняться терминами. Вы просто вызываете его так же, как и get_terms() (не устаревшая форма с только массивом в качестве аргумента). Он возвращает массив
WP_Term
объектов с дополнительным свойством, называемымchildren
.Использование простое:
Будьте уверены, что
hierarchical=true
передается на вашget_terms()
вызов.Обратите внимание, что
hierarchical=true
это значение по умолчанию, так что на самом деле просто убедитесь, что оно не было изменено наfalse
.Здесь у меня есть четырехуровневый раскрывающийся список выбора со скрытым первым элементом.