Вопрос или проблема
У меня есть пользовательский тип записи ‘downloads’, для которого я настроил пользовательский шаблон для получения терминов на начальном этапе. Теперь я пытаюсь настроить мой шаблон таксономии, чтобы он отображал подкатегории, если таковые имеются, но если нет, чтобы показывать записи для этого термина.
Ниже приведено то, что включает мой шаблон таксономии на данный момент, и это работает хорошо до тех пор, пока он показывает дочерние категории, но затем не показывает записи для этой категории в конце. Я хотел бы, чтобы, если есть дочерние категории, то показывать их, в противном случае показывать записи для этой категории.
<?php
$term = get_queried_object();
$term_id = $term->term_id;
$taxonomy_name = $term->taxonomy;
$termchildren = get_term_children( $term_id, $taxonomy_name );?>
<?php foreach ( $termchildren as $child ) {
$term = get_term_by( 'id', $child, $taxonomy_name ); ?>
<li>
<?php echo $term->name; ?>
<?php echo $term->description; ?>
</li>
<?php } ?>
Пожалуйста, попробуйте это
<?php
$term = get_queried_object();
$term_id = $term->term_id;
$taxonomy_name = $term->taxonomy;
$termchildren = get_term_children( $term_id, $taxonomy_name );?>
<?php foreach ( $termchildren as $child ) {
$term = get_term_by( 'id', $child, $taxonomy_name ); ?>
<li>
<?php echo $term->name; ?>
<?php echo $term->description; ?>
</li>
<?php }
if ( have_posts() ) :
/* Начать цикл */
while ( have_posts() ) : the_post();
echo get_the_title($post->ID);
endwhile;
the_posts_pagination( array(
'prev_text' => twentyseventeen_get_svg( array( 'icon' => 'arrow-left' ) ) . '<span class="screen-reader-text">' . __( 'Предыдущая страница', 'twentyseventeen' ) . '</span>',
'next_text' => '<span class="screen-reader-text">' . __( 'Следующая страница', 'twentyseventeen' ) . '</span>' . twentyseventeen_get_svg( array( 'icon' => 'arrow-right' ) ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Страница', 'twentyseventeen' ) . ' </span>',
) );
?>
Ответ или решение
Для решения задачи отображения подкатегорий и постов в шаблоне таксономии для произвольного типа записи ‘downloads’ в WordPress, необходимо внести некоторые изменения и дополнения в ваш имеющийся код. Ниже приведем шаги с детальным описанием, которые помогут вам достичь поставленной цели.
Шаг 1: Получение объекта термина
Первоначально необходимо получить объект термина, который будет использоваться для извлечения подкатегорий и постов. Ваш код уже корректно получает объект термина:
$term = get_queried_object();
$term_id = $term->term_id;
$taxonomy_name = $term->taxonomy;
Шаг 2: Получение подкатегорий
Затем, с помощью функции get_term_children
, вы уже извлекаете подкатегории:
$termchildren = get_term_children($term_id, $taxonomy_name);
Шаг 3: Отображение подкатегорий
Код для отображения подкатегорий выглядит хорошо. Мы просто добавим проверку, есть ли подкатегории, и если они есть, отобразим их:
if ($termchildren) {
echo '<ul>';
foreach ($termchildren as $child) {
$child_term = get_term_by('id', $child, $taxonomy_name);
echo '<li>' . esc_html($child_term->name) . '</li>';
if (!empty($child_term->description)) {
echo '<p>' . esc_html($child_term->description) . '</p>';
}
}
echo '</ul>';
}
Шаг 4: Отображение постов
Теперь необходимо добавить функциональность, которая будет отображать посты для текущего термина, если подкатегорий нет. Для этого используется WP_Query.
Вот как это можно реализовать:
if (empty($termchildren)) {
$args = array(
'post_type' => 'downloads',
'tax_query' => array(
array(
'taxonomy' => $taxonomy_name,
'field' => 'term_id',
'terms' => $term_id,
),
),
);
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
echo '<li>' . get_the_title() . '</li>';
}
echo '</ul>';
the_posts_pagination(array(
'prev_text' => 'Предыдущая',
'next_text' => 'Следующая',
));
} else {
echo '<p>Нет доступных записей.</p>';
}
// Сброс переменной после WP_Query
wp_reset_postdata();
}
Полный код шаблона
В результате ваш полный код шаблона таксономии может выглядеть следующим образом:
<?php
$term = get_queried_object();
$term_id = $term->term_id;
$taxonomy_name = $term->taxonomy;
$termchildren = get_term_children($term_id, $taxonomy_name);
if ($termchildren) {
echo '<ul>';
foreach ($termchildren as $child) {
$child_term = get_term_by('id', $child, $taxonomy_name);
echo '<li>' . esc_html($child_term->name) . '</li>';
if (!empty($child_term->description)) {
echo '<p>' . esc_html($child_term->description) . '</p>';
}
}
echo '</ul>';
} else {
$args = array(
'post_type' => 'downloads',
'tax_query' => array(
array(
'taxonomy' => $taxonomy_name,
'field' => 'term_id',
'terms' => $term_id,
),
),
);
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
echo '<li>' . get_the_title() . '</li>';
}
echo '</ul>';
the_posts_pagination(array(
'prev_text' => 'Предыдущая',
'next_text' => 'Следующая',
));
} else {
echo '<p>Нет доступных записей.</p>';
}
wp_reset_postdata();
}
?>
Заключение
Данный код обеспечит корректное отображение подкатегорий для текущей таксономии, а в случае их отсутствия — списком выведет записи, относящиеся к данной категории. Это решение является идеальным с точки зрения производительности и лучшей практики кодирования. Вы можете дополнительно стилизовать вывод в зависимости от ваших нужд.