Отобразить таксономии уровня 3

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

Я немного запутался, как справиться с таким выводом.
Я собираюсь отображать трехуровневые таксономии. Когда термин выбирается, мне все еще нужно отображать его “братьев” того же уровня, но также и его “детей”…
Записи должны отображаться только тогда, когда я нажимаю на термин таксономии третьего уровня.

Пожалуйста, посмотрите на макет ниже.
трехуровневые таксономии

Вот общая рекомендация, чтобы получить то, что вам нужно.
Используйте get_term() для получения терминов 1-го, 2-го и 3-го уровней. Документация здесь и здесь.

Термины 1-го уровня: вы можете отображать этот список терминов напрямую в php следующим образом

$taxonomy = "SOME_TAXONOMY";
$terms = get_terms([
     'taxonomy' => $taxonomy,
     'parent' => 0,
     ]);


if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) { ?>
<ul>
    <?php 
    foreach ($terms as $term) : ?>
        <li>
            <a href="https://wordpress.stackexchange.com/questions/332234/<?php echo get_term_link($term->term_id); ?>"><?php echo $term->name; ?></a>
        </li>
    <?php endforeach; ?>
</ul>

Термины 2-го / 3-го уровня
После отображения терминов 1-го уровня вам следует использовать ajax действие, чтобы получить дочерние термины выбранного родительского термина. Передайте id родительского термина в функцию ajax действия. Документация по использованию Ajax с WordPress здесь.

Код для ajax действия должен выглядеть следующим образом.

function wp_ajax_child_terms_action(){

    $taxonomy = "SOME_TAXONOMY";
    $parent = $_GET['id_of_parent_from_ajax'];
    $terms = get_terms([
        'taxonomy' => $taxonomy,
        'parent' => $parent,
     ]);


    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) { ?>
       <ul>
           <?php foreach ($terms as $term) : ?>
            <li>
                 <a href="https://wordpress.stackexchange.com/questions/332234/<?php echo get_term_link($term->term_id); ?>"><?php echo $term->name; ?></a>
            </li>
            <?php endforeach; ?>
      </ul>

<?php }  ?>

Надеюсь, это поможет вам начать.

Ответ или решение

Как отобразить трехуровневую таксономию в WordPress

Для реализации задачи отображения трехуровневой таксономии в WordPress, вы можете следовать данному пошаговому руководству. Мы будем использовать функции WordPress для работы с таксономиями и AJAX для динамического обновления данных. Ниже представлены основные этапы процесса, включая примеры кода.

Шаг 1: Отображение терминов первого уровня

Сначала необходимо получить и отобразить термины первого уровня. Для этого используйте функцию get_terms(), которая позволяет извлекать термины по заданной таксономии. Вот пример кода для отображения первого уровня:

$taxonomy = "ваша_таксономия";
$terms = get_terms([
    'taxonomy' => $taxonomy,
    'parent'   => 0,
]);

if (!empty($terms) && !is_wp_error($terms)) {
    echo '<ul>';
    foreach ($terms as $term) {
        echo '<li>';
        echo '<a href="#" class="term-link" data-term-id="' . esc_attr($term->term_id) . '">' . esc_html($term->name) . '</a>';
        echo '</li>';
    }
    echo '</ul>';
}

Шаг 2: AJAX для подгрузки дочерних терминов

Теперь, когда у нас есть термины первого уровня, необходимо организовать передачу данных через AJAX для получения дочерних терминов (второго и третьего уровней). При нажатии на термин первого уровня вызовем AJAX, который будет извлекать термины с родителем, равным ID выбранного термина.

JavaScript код для обработки кликов и AJAX запросов:

jQuery(document).ready(function($) {
    $('.term-link').on('click', function(e) {
        e.preventDefault();

        const termId = $(this).data('term-id');

        $.ajax({
            url: ajaxurl, // встроенный AJAX URL
            type: 'GET',
            data: {
                action: 'get_child_terms',
                id_of_parent: termId
            },
            success: function(response) {
                // Если не чистим, можно добавить полученные результаты где угодно в список
                $('#child-terms-container').html(response);
            },
            error: function() {
                alert('Произошла ошибка. Попробуйте еще раз.');
            }
        });
    });
});

Шаг 3: Обработка AJAX запроса в PHP

Теперь следует создать обработчик для AJAX-запроса, который будет возвращать дочерние термины. Это можно сделать, добавив следующий код в файл вашей темы или плагина:

function get_child_terms_action() {
    $taxonomy = "ваша_таксономия";
    $parent = intval($_GET['id_of_parent']);

    $terms = get_terms([
        'taxonomy' => $taxonomy,
        'parent'   => $parent,
    ]);

    if (!empty($terms) && !is_wp_error($terms)) {
        echo '<ul>';
        foreach ($terms as $term) {
            echo '<li>';
            echo '<a href="#" class="term-link" data-term-id="' . esc_attr($term->term_id) . '">' . esc_html($term->name) . '</a>';
            echo '</li>';
        }
        echo '</ul>';
    } else {
        echo '<p>Нет дочерних терминов.</p>';
    }
    wp_die(); // Завершение AJAX запроса
}
add_action('wp_ajax_get_child_terms', 'get_child_terms_action');
add_action('wp_ajax_nopriv_get_child_terms', 'get_child_terms_action'); // Для незарегистрированных пользователей

Шаг 4: Отображение терминов третьего уровня и постов

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

function get_posts_by_term_action() {
    $term_id = intval($_GET['term_id']);

    $query = new WP_Query([
        'post_type' => 'ваш_тип_постов',
        'tax_query' => [
            [
                'taxonomy' => 'ваша_таксономия',
                'field'    => 'term_id',
                'terms'    => $term_id,
            ],
        ],
    ]);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            echo '<h2>' . get_the_title() . '</h2>';
            // Дополнительный код для отображения содержимого поста
        }
        wp_reset_postdata();
    } else {
        echo '<p>Нет постов для отображения.</p>';
    }
    wp_die();
}
add_action('wp_ajax_get_posts_by_term', 'get_posts_by_term_action');
add_action('wp_ajax_nopriv_get_posts_by_term', 'get_posts_by_term_action');

Заключение

С помощью приведенных выше шагов вы сможете создать динамическое и интуитивно понятное отображение трехуровневой таксономии с использованием AJAX в WordPress. Это позволит пользователям легко навигировать и находить контент. Не забудьте протестировать все составляющие на предмет ошибок, и следить за оптимальностью выполнения AJAX-запросов.

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

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