Вопрос или проблема
У меня есть пользовательский тип записи и таксономия с дочерними элементами, с файлом шаблона под названием 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>"; // Сообщение, если дочерних терминов нет
}
?>
Описание основных частей кода:
-
Получение текущего термина: Используем
get_query_var()
для извлечения слага и названия таксономии для получения текущего термина. -
Получение дочерних терминов: Функция
get_term_children()
возвращает массив дочерних терминов текущего термина. -
Цикл по дочерним терминам: Для каждого дочернего термина вызывается функция
get_term_by()
, чтобы получить данные термина, и выводится его имя. -
Запрос постов: Используется класс
WP_Query
для запроса постов, относящихся к каждому дочернему термину, с соответствующими параметрами (post_type
,tax_query
и т.д.). -
Вывод постов: Если посты существуют, они выводятся в виде ненумерованного списка с заголовками и ссылками на сами посты.
-
Сбрасывание данных: Вызов
wp_reset_postdata()
для восстановления глобального объекта$post
после завершения цикла.
Рекомендации:
- Убедитесь, что заменили
'your_custom_post_type'
на имя вашего собственного типа поста. - Код также учитывает нюансы SEO, поскольку организует посты в чистый HTML-структуры, что благоприятно для индексации поисковыми системами.
- Добавьте CSS-стили для улучшения визуального восприятия данных на странице, если это необходимо.
Данный код можно легко модифицировать и расширять в зависимости от ваших конкретных требований и дизайна.