Вопрос или проблема
Пример:
Лечение – (Термин типа ресурса Таксономия)
Название ресурса 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();
}
Применение
-
Получение текущего термина таксономии: мы используем
get_queried_object()
, чтобы получить текущий термин, например, "Лечение", принадлежащий таксономииresource_type
. -
Создание запроса для получения постов, связанных с текущим термином: используется WP_Query с параметрами, чтобы фильтровать посты по терминусу, что позволяет извлечь все посты, связанные с "Лечением".
-
Итерация по всему набору постов: в каждом посте мы находим термины таксономии
resource_name
, чтобы выявить все уникальные термины. -
Создание вложенного запроса: для каждого термина
resource_name
, найдены предыдущим запросом, создаем новый запрос WP_Query, чтобы получить и отобразить все посты, связанные с каждымresource_name
.
Этот алгоритм решает вашу задачу структурирования данных, обеспечивает группировку постов по resource_name
в рамках текущего resource_type
, и должен быть достаточно эффективным для использования в WordPress проектах.