Вопрос или проблема
Как перечислить все термины пользовательской таксономии, которые связаны с другой пользовательской таксономией?
Я создаю страницу фильтра для пользовательского типа записи (CPT) с несколькими пользовательскими таксономиями.
Пожалуйста, смотрите скриншот ниже:
- Пользовательский тип записи: Английский “cpt_english”
- Пользовательская таксономия: Курсы
- Термины: course-a, course-b, course-c
- Пользовательская таксономия: Сложности
- Термины: легкий, продвинутый, профессионал
- Пользовательская таксономия: Задачи “tasks”
- Термины: task1, task2, task3, task4
Скриншот представляет собой HTML-разметку, а не сгенерированный PHP-код.
Вопрос:
Как я могу перечислить все термины таксономии на основе другой таксономии?
Например, Тип: “Задача 1” имеет “Сложность”: Легкий, Продвинутый, Профессионал”
Но “Задача 2” имеет только “Легкий” и “Профессионал” … так что при нажатии на Задачу 2 я не хочу показывать “Продвинутый”, и Задача 3 даже не имеет “Курсов”… как я могу этого достичь с помощью кода?
То есть, что я имею в виду, это количество всех CPT, связанных с “Задачей 1” (имя термина) пользовательской таксономии “задачи”; эти записи также связаны с терминами “легкий”, “продвинутый” и “профессионал” из другой таксономии “сложность”.
Однако, среди элементов CPT, связанных с “Задачей 2”, ни один из них не связан с “продвинутым” … так что я не хочу перечислять “продвинутый” там.
Я знаю, что могу использовать “get_terms” и затем “foreach”, чтобы перечислить все термины таксономии.
Но как я могу “получить термины таксономии_a на основе таксономии_b”?
Я предполагаю, что ваша пользовательская таксономия иерархична, и вы пытаетесь получить дочерние элементы в иерархии. Если это так, то этот предыдущий ответ может помочь.
Получить дочерние элементы родительской категории
И эта функция wp: https://developer.wordpress.org/reference/functions/get_term_children/
Основываясь на вашей проблеме, я провел исследование и нашел решение.
https://stackoverflow.com/a/69483006/15424153
Это работает.
Вы можете использовать функцию get_terms()
вместе с пользовательским запросом, чтобы извлечь термины из одной таксономии на основе терминов, выбранных в другой таксономии.
Не протестированный код
// Предполагая, что у вас есть выбранный термин из таксономии "Задачи"
$selected_task = 'task2'; // Замените это на выбранную задачу
// Получить объект термина для выбранной задачи
$task_term = get_term_by('slug', $selected_task, 'tasks');
if ($task_term) {
// Получить связанные термины из таксономии "Сложности" для выбранной задачи
$difficulty_terms = get_the_terms($task_term->term_id, 'difficulties');
if ($difficulty_terms && !is_wp_error($difficulty_terms)) {
// Извлечь слаги термина из терминов сложности
$difficulty_slugs = wp_list_pluck($difficulty_terms, 'slug');
// Получить термины из таксономии "Курсы", связанные с выбранными сложностями
$course_terms = get_terms(array(
'taxonomy' => 'courses',
'hide_empty' => false,
'meta_query' => array(
array(
'key' => 'difficulty', // Предполагая, что это имя пользовательского поля для сложности
'value' => $difficulty_slugs,
'compare' => 'IN',
),
),
));
if ($course_terms && !is_wp_error($course_terms)) {
// Вывести список терминов курсов
echo '';
foreach ($course_terms as $course_term) {
echo '- ' . $course_term->name . '
';
}
echo '
';
} else {
echo 'Термины курсов не найдены.';
}
} else {
echo 'Термины сложности не найдены для выбранной задачи.';
}
} else {
echo 'Выбранная задача недействительна.';
}
Сначала мы получаем объект термина для выбранной задачи из таксономии Задачи
. Затем мы извлекаем связанные термины сложности для выбранной задачи. После этого мы извлекаем слаги терминов сложности. Наконец, мы используем пользовательский запрос для получения терминов курсов, связанных с выбранными сложностями из таксономии Курсы
.
Ответ или решение
Как получить пользовательские термины таксономии на основе другой таксономии?
Ваша задача заключается в отображении терминов одной пользовательской таксономии (например, "Курсы") в зависимости от выбранной категории другой таксономии (например, "Задачи"). Мы рассмотрим ситуацию, когда для каждой задачи доступны определенные уровни сложности, и вы хотите фильтровать курс по этим уровням.
1. Понимание структуры
Пользовательский тип записи (CPT): cpt_english
Пользовательские таксономии:
- Задачи (tasks):
- термины:
task1
,task2
,task3
,task4
- термины:
- Сложности (difficulties):
- термины:
easy
,advanced
,pro
- термины:
- Курсы (courses):
- термины:
course-a
,course-b
,course-c
- термины:
2. Определение выбранной задачи
Мы начнем с того, что получим выбранный термин из таксономии "Задачи". Например, предположим, что пользователь выбрал task2
.
$selected_task = 'task2'; // Замените на выбранную задачу
$task_term = get_term_by('slug', $selected_task, 'tasks');
3. Получение связанных терминов сложности
После того как мы получили объект термина для выбранной задачи, мы можем извлечь связанные термины сложности:
if ($task_term) {
// Получаем связанные термины из таксономии "Сложности"
$difficulty_terms = get_the_terms($task_term->term_id, 'difficulties');
if ($difficulty_terms && !is_wp_error($difficulty_terms)) {
// Извлекаем слуги терминов сложности
$difficulty_slugs = wp_list_pluck($difficulty_terms, 'slug');
4. Получение связанных курсов на основе сложности
Теперь, когда у нас есть слуги уровней сложности, мы можем использовать их для получения курсов:
// Получаем термины из таксономии "Курсы" на основе выбранных сложностей
$course_terms = get_terms(array(
'taxonomy' => 'courses',
'hide_empty' => false,
'meta_query' => array(
array(
'key' => 'difficulty', // Предполагаем имя пользовательского поля для сложности
'value' => $difficulty_slugs,
'compare' => 'IN',
),
),
));
// Выводим список связанных курсов
if ($course_terms && !is_wp_error($course_terms)) {
echo '<ul>';
foreach ($course_terms as $course_term) {
echo '<li>' . esc_html($course_term->name) . '</li>';
}
echo '</ul>';
} else {
echo 'Курсы не найдены.';
}
} else {
echo 'Сложности не найдены для выбранной задачи.';
}
} else {
echo 'Выбранная задача некорректна.';
}
Заключение
Таким образом, мы реализовали механизм получения терминов одной таксономии на основе выбора в другой таксономии. Этот подход позволяет динамически фильтровать и отображать данные, что дает пользователям более удобный интерфейс и улучшает восприятие информации.
Убедитесь, что все выводимые данные безопасно обработаны, используя функции, такие как esc_html()
, чтобы предотвратить возможные уязвимости. Вы также можете адаптировать код для специфических нужд вашего проекта, учитывая особенности структуры вашей базы данных и ваших пользовательских полей.