Список постов из детей текущей таксономии

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

У меня есть пользовательский тип записи и таксономия с дочерними элементами, с файлом шаблона под названием taxonomy-productcategories.php. В этом файле я хочу перечислить всех детей с их записями.

  • Дочерняя таксономия 1

    • Дочерняя таксономия 1 Запись A
    • Дочерняя таксономия 1 Запись B
    • Дочерняя таксономия 1 Запись C
  • Дочерняя таксономия 2

    • Дочерняя таксономия 2 Запись D
    • Дочерняя таксономия 2 Запись E
    • Дочерняя таксономия 2 Запись F

И так далее…

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

<?php
$term_slug = get_query_var( 'term' );
$taxonomyName = get_query_var( 'taxonomy' );
$current_term = get_term_by( 'slug', $term_slug, $taxonomyName );
$termchildren = get_term_children( $current_term->term_id, $taxonomyName );

foreach ($termchildren as $child) {
    $term = get_term_by( 'id', $child, $taxonomyName );
    echo "$term->name:<br />"; 

}
?>

У меня была идея объединить первый код с этим решением, которое перечисляет записи из конкретной таксономии:

<?php $terms = get_terms('productcategories');
    foreach ($terms as $term) {
        $wpq = array (
        'taxonomy'=>'productcategories',
        'term'=>$term->slug,
        'order'=>'asc',
        'orderby'=>'title');
        $query = new WP_Query ($wpq);
        echo "$term->name:<br />"; 
        ?>
        <?php
        if ($query->have_posts() ) : while ($query->have_posts() ) : $query->the_post(); ?>
        <a href="https://wordpress.stackexchange.com/questions/123059/<?php the_permalink();?>"><?php the_title();?></a>, 
        <?php endwhile; endif; wp_reset_query(); ?>
        <?php
        echo "<br />";   
    }
?>

Мне удалось объединить два кода, так что это мое текущее решение. Возможно, это не лучшее, но оно работает.

<?php 
    $term_slug = get_query_var( 'term' );
    $taxonomyName = get_query_var( 'taxonomy' );
    $current_term = get_term_by( 'slug', $term_slug, $taxonomyName );
    $termchildren = get_term_children( $current_term->term_id, $taxonomyName );
    foreach ($termchildren as $child) {
    $term = get_term_by( 'id', $child, $taxonomyName );
        $wpq = array (
        'taxonomy'=>$taxonomyName,
        'term'=>$term->slug,
        'order'=>'asc',
        'orderby'=>'title');
        $query = new WP_Query ($wpq);
        echo "$term->name:<br />"; 
        ?>

        <?php
        if ($query->have_posts() ) : while ($query->have_posts() ) : $query->the_post(); ?>
        <a href="https://wordpress.stackexchange.com/questions/123059/<?php the_permalink();?>"><?php the_title();?></a>, 
        <?php endwhile; endif; wp_reset_query(); ?>
        <?php
        echo "<br />";   
    }
?>

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

Для реализации задачи по списку всех дочерних таксономий и их постов в шаблоне taxonomy-productcategories.php, вы можете использовать функцию get_term_children() для получения дочерних терминов и класс WP_Query для извлечения постов, связанных с этими терминами. У вас уже есть неплохой стартовый код, который необходимо немного улучшить для повышения читаемости и производительности.

Полный пример кода:

<?php
// Получаем текущий слаг термина и название таксономии
$term_slug = get_query_var('term'); 
$taxonomyName = get_query_var('taxonomy'); 

// Получаем текущий термин
$current_term = get_term_by('slug', $term_slug, $taxonomyName); 

// Получаем дочерние термины текущего термина
$termchildren = get_term_children($current_term->term_id, $taxonomyName); 

// Проверяем, есть ли дочерние термины
if (!empty($termchildren)) {
    foreach ($termchildren as $child) {
        $term = get_term_by('id', $child, $taxonomyName); 
        echo "<h2>{$term->name}:</h2>"; // Заголовок для дочернего термина

        // Настраиваем параметры запроса для постов
        $wpq = array(
            'post_type' => 'your_custom_post_type', // Замените на свой тип поста
            'tax_query' => array(
                array(
                    'taxonomy' => $taxonomyName,
                    'field'    => 'slug',
                    'terms'    => $term->slug,
                ),
            ),
            'order' => 'ASC',
            'orderby' => 'title',
            'posts_per_page' => -1 // Для получения всех постов
        );

        // Создаем новый экземпляр WP_Query
        $query = new WP_Query($wpq);

        // Проверяем наличие постов
        if ($query->have_posts()) {
            echo "<ul>"; // Начинаем ненумерованный список
            while ($query->have_posts()) {
                $query->the_post(); // Получаем данные поста
                echo "<li><a href=\"" . get_permalink() . "\">" . get_the_title() . "</a></li>"; // Ссылка на пост
            }
            echo "</ul>"; // Закрываем ненумерованный список
        } else {
            echo "<p>Нет постов в этой категории.</p>"; // Сообщение, если постов нет
        }

        wp_reset_postdata(); // Сбрасываем данные после запроса
    }
} else {
    echo "<p>Нет дочерних категорий.</p>"; // Сообщение, если дочерних терминов нет
}
?>

Описание основных частей кода:

  1. Получение текущего термина: Используем get_query_var() для извлечения слага и названия таксономии для получения текущего термина.

  2. Получение дочерних терминов: Функция get_term_children() возвращает массив дочерних терминов текущего термина.

  3. Цикл по дочерним терминам: Для каждого дочернего термина вызывается функция get_term_by(), чтобы получить данные термина, и выводится его имя.

  4. Запрос постов: Используется класс WP_Query для запроса постов, относящихся к каждому дочернему термину, с соответствующими параметрами (post_type, tax_query и т.д.).

  5. Вывод постов: Если посты существуют, они выводятся в виде ненумерованного списка с заголовками и ссылками на сами посты.

  6. Сбрасывание данных: Вызов wp_reset_postdata() для восстановления глобального объекта $post после завершения цикла.

Рекомендации:

  • Убедитесь, что заменили 'your_custom_post_type' на имя вашего собственного типа поста.
  • Код также учитывает нюансы SEO, поскольку организует посты в чистый HTML-структуры, что благоприятно для индексации поисковыми системами.
  • Добавьте CSS-стили для улучшения визуального восприятия данных на странице, если это необходимо.

Данный код можно легко модифицировать и расширять в зависимости от ваших конкретных требований и дизайна.

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

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