Нужна помощь с циклом запросов. Необходимо получить текущий термин таксономии и его записи и сгруппировать их по другому выбранному термину таксономии.

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

Пример:

Лечение – (Термин типа ресурса Таксономия)

Название ресурса 1 (термин имени ресурса Таксономия)

  • Ресурс 1 – Публикация 1
  • Ресурс 1 – Публикация 2

Название ресурса 2 (термин имени ресурса Таксономия)

  • Ресурс 2 – Публикация 1
  • Ресурс 2 – Публикация 2

Вот мой код на данный момент. Он правильно группирует все названия ресурсов и публикации вместе, но не показывает конкретный тип ресурса (например, Лечение). Надеюсь, это понятно. Может кто-то помочь? Я в правильном направлении?

$current_tax = get_queried_object();

            //петля через текущий термин таксономии

             $query_type = new WP_Query( array(
                'post_type' => 'resource_guide',
                'tax_query' => array(
                    array (
                        'taxonomy' => 'resource_type',
                        'hide_empty'=> false,
                        //'parent' =>0,
                        'field' => 'slug',
                        'terms' => $current_tax,
                    )
                ),
                'posts_per_page' => '-1',
                'order' => 'ASC', 
                'orderby' => 'name',
                )
            ); 

                         if ( $query_type->have_posts()) :
    
                            while ( $query_type->have_posts() ) : $query_type->the_post(); 
                            
                                // Получить название ресурса таксономии   
                                
                                $resource_names = get_terms( array(
                                    'taxonomy' => 'resource_name',
                                    'hide_empty' => false, 
                                    'parent' =>0,
                                ) );    

                                //Цикл через названия ресурса таксономии Показать имя 

                                foreach ( $resource_names as $resource_name ) :
                                    echo $resource_name->name;

                                    
                                    $query = new WP_Query( array(
                                        'post_type' => 'resource_guide', 
                                        'tax_query' => array(
                                            
                                            array (
                                                'taxonomy' => $resource_name->taxonomy,
                                                'hide_empty'=> false,
                                                'terms' => $resource_name->term_id,
                                                'parent' =>0,
                                            ),
                                        ),
                                        'posts_per_page' => '-1',
                                        'order' => 'ASC', 'orderby' => 'name',
                                        )
                                    );
                                        if ( $query->have_posts()) :
                                                
                                                while ( $query->have_posts() ) : $query->the_post(); ?>

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

Вопрос о формировании запросов в WordPress, чтобы получить текущий термин таксономии и его записи, сгруппированные по другому выбранному термину таксономии, требует понимания структуры таксономий и работы с WP_Query. В вашем примере вам нужно первым делом определить текущий термин таксономии resource_type, а затем сгруппировать записи для каждого ресурса по таксономии resource_name.

Теория

WordPress предоставляет функционал для работы с кастомными таксономиями и постами через класс WP_Query. С его помощью вы можете создавать кастомные запросы для извлечения постов, которые соответствуют определенным условиям (например, терминам таксономии).

Основные понятия:

  • Таксономия (Taxonomy): это способ классификации контента в WordPress. Например, категории и теги — это таксономии по умолчанию.
  • Термин (Term): это конкретное значение внутри таксономии, например, "Лечение" — это термин таксономии resource_type.
  • WP_Query: это класс, используемый для выполнения кастомных запросов к базе данных WordPress для получения постов, которые соответствуют заданным параметрам.

Пример

Ниже представлен обновленный код, учитывающий ваше описание и исправляющий текущие ошибки и упущения.

$current_taxonomy_term = get_queried_object(); // Получаем текущий термин таксономии

// Проверяем, что термин получен
if ($current_taxonomy_term) {
    echo '<h2>' . $current_taxonomy_term->name . ' - (Термин из таксономии resource_type)</h2>';

    // Получаем посты, связанные с текущим термином ресурса
    $resource_query = new WP_Query(array(
        'post_type' => 'resource_guide',
        'tax_query' => array(
            array(
                'taxonomy' => 'resource_type',
                'field' => 'slug',
                'terms' => $current_taxonomy_term->slug,
            ),
        ),
        'posts_per_page' => -1,
    ));

    if ($resource_query->have_posts()) {
        // Собираем все термины таксономии resource_name, связанные с найденными постами
        $resource_names = array();

        while ($resource_query->have_posts()) {
            $resource_query->the_post();
            $terms = wp_get_post_terms(get_the_ID(), 'resource_name', array('fields' => 'all'));

            foreach ($terms as $term) {
                if (!isset($resource_names[$term->term_id])) {
                    $resource_names[$term->term_id] = $term;
                }
            }
        }

        // Группируем посты по терминам таксономии resource_name
        foreach ($resource_names as $resource_term) {
            echo '<h3>' . $resource_term->name . ' (Термин из таксономии resource_name)</h3>';

            $post_query = new WP_Query(array(
                'post_type' => 'resource_guide',
                'tax_query' => array(
                    array(
                        'taxonomy' => 'resource_name',
                        'field' => 'term_id',
                        'terms' => $resource_term->term_id,
                    ),
                    array(
                        'taxonomy' => 'resource_type',
                        'field' => 'slug',
                        'terms' => $current_taxonomy_term->slug,
                    ),
                ),
                'posts_per_page' => -1,
            ));

            if ($post_query->have_posts()) {
                echo '<ul>';
                while ($post_query->have_posts()) {
                    $post_query->the_post();
                    echo '<li>' . get_the_title() . '</li>';
                }
                echo '</ul>';
            }

            // Сброс поста
            wp_reset_postdata();
        }
    } else {
        echo 'Нет записей, соответствующих указанному критерию.';
    }

    // Сброс основной выборки постов
    wp_reset_postdata();
}

Применение

  1. Получение текущего термина таксономии: мы используем get_queried_object(), чтобы получить текущий термин, например, "Лечение", принадлежащий таксономии resource_type.

  2. Создание запроса для получения постов, связанных с текущим термином: используется WP_Query с параметрами, чтобы фильтровать посты по терминусу, что позволяет извлечь все посты, связанные с "Лечением".

  3. Итерация по всему набору постов: в каждом посте мы находим термины таксономии resource_name, чтобы выявить все уникальные термины.

  4. Создание вложенного запроса: для каждого термина resource_name, найдены предыдущим запросом, создаем новый запрос WP_Query, чтобы получить и отобразить все посты, связанные с каждым resource_name.

Этот алгоритм решает вашу задачу структурирования данных, обеспечивает группировку постов по resource_name в рамках текущего resource_type, и должен быть достаточно эффективным для использования в WordPress проектах.

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

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