Вопрос или проблема
Я немного запутался, как справиться с таким выводом.
Я собираюсь отображать трехуровневые таксономии. Когда термин выбирается, мне все еще нужно отображать его “братьев” того же уровня, но также и его “детей”…
Записи должны отображаться только тогда, когда я нажимаю на термин таксономии третьего уровня.
Вот общая рекомендация, чтобы получить то, что вам нужно.
Используйте 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-запросов.