Как получить пользовательские термины таксономии на основе другой таксономии?

Вопрос или проблема

Как перечислить все термины пользовательской таксономии, которые связаны с другой пользовательской таксономией?

Я создаю страницу фильтра для пользовательского типа записи (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(), чтобы предотвратить возможные уязвимости. Вы также можете адаптировать код для специфических нужд вашего проекта, учитывая особенности структуры вашей базы данных и ваших пользовательских полей.

Оцените материал
Добавить комментарий

Капча загружается...