Вопрос или проблема
У меня есть следующий код. Он позволяет мне показывать подкатегории и документы внутри них. Дело в том, что подкатегория может содержать дальнейшие подкатегории. Код ниже покажет документы, принадлежащие подподкатегории (внуку), на уровне подкатегории (родителя).
Пожалуйста, может кто-то объяснить, как решить эту проблему, чтобы документы отображались только под категорией, к которой они относятся напрямую? Кроме того, как выделить, что такое подподкатегория (внук)? Все заголовки постов должны быть связаны с соответствующим постом.
<?php
$categories = get_categories('child_of=34');
foreach ($categories as $category) {
//Отображение информации о подкатегории с использованием значений $category, таких как $category->cat_name
echo '<h3>'.$category->name.'</h3>';
echo '<ul>';
foreach (get_posts('cat=".$category->term_id) as $post) {
setup_postdata( $post );
echo "<li><a href='".get_permalink($post->ID)."'>".get_the_title().'</a></li>';
}
echo '</ul>';
}
?>
Что-то вроде следующего:
- Подкатегория 1
- Пост 1
- Пост 2
- Подкатегория 2
- Подподкатегория 1
- Пост 3
- Подподкатегория 2
- Пост 4
- Подподкатегория 1
Попробуйте это:
<!-- Начало архива категории -->
<ul class="catArchive">
<?php
$catQuery = $wpdb->get_results("SELECT * FROM $wpdb->terms AS wterms INNER JOIN $wpdb->term_taxonomy AS wtaxonomy ON ( wterms.term_id = wtaxonomy.term_id ) WHERE wtaxonomy.taxonomy = 'category' AND wtaxonomy.parent = 0 AND wtaxonomy.count > 0");
$catCounter = 0;
foreach ($catQuery as $category) {
$catCounter++;
$catStyle="";
if (is_int($catCounter / 2)) $catStyle=" class="catAlt"";
$catLink = get_category_link($category->term_id);
echo '<li'.$catStyle.'><h3><a href="'.$catLink.'" title="'.$category->name.'">'.$category->name.'</a></h3>';
echo '<ul style="margin-left:15px;">';
query_posts('category__in='.$category->term_id.'&showposts=5');?>
<?php while (have_posts()) : the_post(); ?>
<li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
<li><a href="<?php echo $catLink; ?>" title="<?php echo $category->name; ?>">Больше <strong><?php echo $category->name; ?></strong></a></li>
<li> <?php
$sub_cat_id = $category->term_id;
$get_sub_args = array('child_of' =>$sub_cat_id);
$categories_arr = get_categories($get_sub_args);
//print_r ($categories_arr);
foreach ($categories_arr as $sacategory) {
//Отображение информации о подкатегории с использованием значений $category, таких как $category->cat_name
echo '<h2>'.$sacategory->name.'</h2>';
echo '<ul style="margin-left:15px;">';
foreach (get_posts('cat=".$sacategory->term_id) as $post) {
setup_postdata( $post );
echo "<li><a href='".get_permalink($post->ID)."'>".get_the_title().'</a></li>';
}
echo '</ul>';
}
?></li>
</ul>
</li>
<?php } ?>
</ul>
<!-- Конец архива категории -->
</div>
.
Ответ или решение
Как отобразить подкатегории и посты в WordPress
Вам необходимо организовать структуру отображения подкатегорий и их постов в WordPress таким образом, чтобы посты из подподкатегорий (внуков) не смешивались с постами из их родительских категорий. Давайте разберем, как это можно реализовать на практике.
Основные задачи:
- Отобразить подкатегории и связанные с ними посты так, чтобы каждая подкатегория показывала только свои посты.
- Подсветить подподкатегории (внуков).
- Сделать названия постов кликабельными, чтобы пользователи могли перейти к полным записям.
Пример кода
Ниже представлен код, который выполнит указанные задачи. В нем используется WordPress функции для получения категорий и постов:
<div class="s-prose js-post-body" itemprop="text">
<ul class="catArchive">
<?php
// Получаем все корневые категории - это может быть изменено на вашу нужную категорию
$catQuery = $wpdb->get_results("SELECT * FROM $wpdb->terms AS wterms INNER JOIN $wpdb->term_taxonomy AS wtaxonomy ON ( wterms.term_id = wtaxonomy.term_id ) WHERE wtaxonomy.taxonomy = 'category' AND wtaxonomy.parent = 0 AND wtaxonomy.count > 0");
foreach ($catQuery as $category) {
// Ссылка на родительскую категорию
$catLink = get_category_link($category->term_id);
echo '<li><h3><a href="' . esc_url($catLink) . '">' . esc_html($category->name) . '</a></h3>';
echo '<ul style="margin-left:15px;">';
// Получаем посты из родительской категории
query_posts('category__in=' . $category->term_id . '&showposts=5');
while (have_posts()) : the_post();
echo '<li><a href="' . get_permalink() . '" rel="bookmark">' . get_the_title() . '</a></li>';
endwhile;
// Получаем подкатегории
$subCategories = get_categories(array('parent' => $category->term_id));
foreach ($subCategories as $subCategory) {
echo '<h4>' . esc_html($subCategory->name) . '</h4>';
echo '<ul style="margin-left:15px;">';
// Получаем посты из подкатегории
foreach (get_posts(array('category' => $subCategory->term_id)) as $post) {
setup_postdata($post);
echo '<li><a href="' . get_permalink($post->ID) . '">' . get_the_title() . '</a></li>';
}
wp_reset_postdata();
echo '</ul>';
}
echo '</ul></li>';
}
?>
</ul>
</div>
Пояснения к коду:
-
Получение корневых категорий:
Используется SQL-запрос к таблицамterms
иterm_taxonomy
, чтобы получить только те категории, у которых нет родителя. -
Отображение постов:
Функцияquery_posts()
используется для извлечения постов из каждой категории. -
Получение подкатегорий:
Внутренний цикл используется для получения подкатегорий текущей категории. Для каждой подкатегории выполняется тот же процесс получения и отображения постов. -
Структура HTML:
Структура HTML организована так, что подкатегории и их посты отображаются в виде вложенных списков. -
Безопасность:
Используются функцииesc_url()
иesc_html()
для экранирования значений, что помогает защитить ваши данные от XSS атак.
SEO и читаемость
- SEO-оптимизация: Использование заголовков (
<h3>
,<h4>
) и описательных ссылок улучшает индексируемость поисковыми системами. - Читаемость: Код структурирован и комментирован, что облегчает его понимание и модификацию в будущем.
Этот подход предоставляет вам гибкое и эффективное решение для отображения иерархии категорий и постов в WordPress, обеспечивая при этом порядок и доступность данных для ваших пользователей.