Отображение категорий, подкатегорий и постов в них
Как следует из заголовка, мне нужно получить список категорий и подкатегорий, а затем посты (с ссылками на них) для этих категорий/подкатегорий.
Вот структура, которую я пытаюсь реализовать:
- Категория 1
- Подкатегория 1 в категории 1
- Пост 1 в подкатегории 1
- Пост 2 в подкатегории 1
- Пост 3 в подкатегории 1
- Подкатегория 2 в категории 1
- Пост 1 в подкатегории 2
- Пост 2 в подкатегории 2
- Пост 3 в подкатегории 2
- Подкатегория 3 в категории 1
- Пост 1 в подкатегории 3
- Пост 2 в подкатегории 3
- Пост 3 в подкатегории 3
- Посты без подкатегории
- Пост 1 без подкатегории
- Пост 2 без подкатегории
- Категория 2
- Подкатегория 1 в категории 2
- Пост 1 в подкатегории 1
- Пост 2 в подкатегории 1
- Пост 3 в подкатегории 1
- Подкатегория 2 в категории 2
- Пост 1 в подкатегории 2
- Пост 2 в подкатегории 2
- Пост 3 в подкатегории 2
- Подкатегория 3 в категории 2
- Пост 1 в подкатегории 3
- Пост 2 в подкатегории 3
- Пост 3 в подкатегории 3
- Посты без подкатегории
- Пост 1 без подкатегории
- Пост 2 без подкатегории
После изучения всей доступной информации у меня получился следующий код:
<ul>
<?php
$get_parent_cats = array(
'parent' => '0' // получаем только родительские категории верхнего уровня
);
$all_categories = get_categories( $get_parent_cats ); // получаем родительские категории
foreach( $all_categories as $single_category ){
// для каждой категории получаем ID
$catID = $single_category->cat_ID;
echo '<li><a href=" ' . get_category_link( $catID ) . ' ">' . $single_category->name . '</a>'; // название и ссылка категории
$get_children_cats = array(
'child_of' => $catID // получаем дочерние элементы для этой родительской категории
);
$child_cats = get_categories( $get_children_cats ); // получаем дочерние категории
echo '<ul class="children">';
foreach( $child_cats as $child_cat ){
// для каждой дочерней категории получаем ID
$childID = $child_cat->cat_ID;
// для каждой дочерней категории выводим ссылку и название
echo '<a href=" ' . get_category_link( $childID ) . ' ">' . $child_cat->name . '</a>';
}
echo '</ul></li>';
} // конец логики работы с категориями ?>
</ul>
Этот код хорошо отображает категории и подкатегории, но мне нужно как-то пройтись по постам и показать их внутри категорий/подкатегорий. Я также пробовал использовать следующий код:
<?php
// получаем все категории из базы данных
$cats = get_categories();
// перебираем категории
foreach ($cats as $cat) {
// получаем ID категории
$cat_id= $cat->term_id;
// Создаем заголовок для категории
echo "<h2>".$cat->name."</h2>";
// создаем кастомный запрос WordPress
query_posts("cat=$cat_id&posts_per_page=100");
// запускаем цикл WordPress!
if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php // создаем ссылку для поста ?>
<a href="<?php the_permalink();?>"><?php the_title(); ?></a>
<?php echo '<hr/>'; ?>
<?php endwhile; endif; // завершаем цикл WordPress. Он запустится заново для каждой категории ?>
<?php } // завершаем foreach ?>
</div><!-- #content -->
</div><!-- #container -->
Этот код показывает все категории и посты внутри каждой категории, но структура не та, которую я хочу. Я пытался объединить эти два фрагмента кода в течение двух дней, но ни одна из попыток не дала желаемого результата. Я неопытен в WordPress и мне действительно нужна помощь с этим.

Обновление: Полный код
<ul>
<?php
$get_parent_cats = array(
'parent' => '0' //получаем только категории верхнего уровня
);
$all_categories = get_categories( $get_parent_cats );//получаем родительские категории
foreach( $all_categories as $single_category ){
//для каждой категории получаем ID
$catID = $single_category->cat_ID;
echo '<li><a href=" ' . get_category_link( $catID ) . ' ">' . $single_category->name . '</a>'; //название категории и ссылка
echo '<ul class="post-title">';
$query = new WP_Query( array( 'cat'=> $catID, 'posts_per_page'=>10 ) );
while( $query->have_posts() ):$query->the_post();
echo '<li><a href="'.get_the_permalink().'">'.get_the_title().'</a></li>';
endwhile;
wp_reset_postdata();
echo '</ul>';
$get_children_cats = array(
'child_of' => $catID //получаем дочерние категории для текущего родителя, используя переменную catID
);
$child_cats = get_categories( $get_children_cats );//получаем дочерние категории родительской категории
echo '<ul class="children">';
foreach( $child_cats as $child_cat ){
//для каждой дочерней категории получаем ID
$childID = $child_cat->cat_ID;
//для каждой дочерней категории выводим ссылку и название
echo '<a href=" ' . get_category_link( $childID ) . ' ">' . $child_cat->name . '</a>';
echo '<ul class="post-title">';
$query = new WP_Query( array( 'cat'=> $childID, 'posts_per_page'=>10 ) );
while( $query->have_posts() ):$query->the_post();
echo '<li><a href="'.get_the_permalink().'">'.get_the_title().'</a></li>';
endwhile;
wp_reset_postdata();
echo '</ul>';
}
echo '</ul></li>';
} //конец логики работы с категориями ?>
</ul>

Привет, Бикаш, спасибо за помощь, но мне нужно, чтобы посты отображались, даже если нет подкатегорий, также мне нужны постоянные ссылки на посты.

Ты имеешь в виду, что не хочешь показывать посты промежуточных категорий, а только посты последней категории!!

Нет, нет, я хочу их показывать, но в случае, если нет подкатегорий, я все равно хочу показывать посты. С кодом, который ты дал, если у меня есть пост в родительской категории, он не отображается. Посмотри на мою структуру, и ты поймешь, что я имею в виду.

Я сделал изображение, чтобы показать, что я имею в виду. ссылка как видите, в "kategorija3" посты не отображаются, потому что у меня нет подкатегории, но у меня есть посты в этой категории. Также у меня есть посты в "kategorija1", у которой нет подкатегории, и они тоже не отображаются.

если вы хотите показывать посты родительской категории и дочерней категории в иерархическом виде, то вам следует использовать тот же цикл внутри родительского цикла foreach
, а также использовать 'cat'=>$catID
в случае родительского цикла foreach
. Если вам нужны подкатегории второго уровня и далее, вам нужно добавить больше вложенных циклов foreach
и wp_query

используйте тот же цикл перед $get_children_cats = array(
'child_of' => $catID //получить дочерние элементы этого родителя, используя переменную catID из предыдущего кода
);
в вашем коде и используйте 'cat' => $catID
на этот раз

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

Давай продолжим обсуждение в чате.

Эта функция работает сразу, просто убедитесь, что изменили названия на свою таксономию и тип записи. Читайте комментарии для дополнительных пояснений.
function ow_categories_with_subcategories_and_posts( $taxonomy, $post_type ) {
$taxonomy = $taxonomy;
$post_type = $post_type;
// Получаем родительские категории для указанной таксономии (те, у которых нет родителя)
$categories = get_terms(
array(
'taxonomy' => $taxonomy,
'parent' => 0, // <-- Без родителя
'orderby' => 'term_id',
'hide_empty' => true // <-- измените на false, чтобы показывать и пустые
)
);
?>
<div>
<?php
// Перебираем все категории для отображения каждой отдельной категории
foreach ( $categories as $category ) {
$cat_name = $category->name;
$cat_id = $category->term_id;
$cat_slug = $category->slug;
// Отображаем название каждой категории с ID и Slug
echo '<h3>Категория: ' . $cat_name . ' - ID: ' . $cat_id . ' - Slug: ' . $cat_slug . '</h3>';
// Получаем все подкатегории для текущей категории
$subcategories = get_terms(
array(
'taxonomy' => $taxonomy,
'parent' => $cat_id, // <-- Родитель - текущая категория
'orderby' => 'term_id',
'hide_empty' => true
)
);
?>
<div>
<?php
// Перебираем все подкатегории для отображения каждой отдельной подкатегории
foreach ( $subcategories as $subcategory ) {
$subcat_name = $subcategory->name;
$subcat_id = $subcategory->term_id;
$subcat_slug = $subcategory->slug;
// Отображаем название каждой подкатегории с ID и Slug
echo '<h4>Подкатегория: ' . $subcat_name . ' - ID: ' . $subcat_id . ' - Slug: ' . $subcat_slug . '</h4>';
// Получаем все записи, принадлежащие этой подкатегории
$posts = new WP_Query(
array(
'post_type' => $post_type,
'posts_per_page' => -1, // <-- Показать все записи
'hide_empty' => true,
'order' => 'ASC',
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'terms' => $subcat_id,
'field' => 'id'
)
)
)
);
// Если есть записи в этой подкатегории
if ( $posts->have_posts() ):
?>
<div>
<?php
// Пока есть записи для отображения
while ( $posts->have_posts() ): $posts->the_post();
// Показываем заголовок каждой записи с ID записи
?>
<p>Запись: <?php the_title(); ?> - ID: <?php the_ID(); ?></p>
<?php
endwhile;
?>
</div>
<?php
else:
echo 'Записей не найдено';
endif;
wp_reset_query();
}
?>
</div>
<?php
}
?>
</div>
<?php
}
ow_categories_with_subcategories_and_posts( 'название_вашей_таксономии', 'название_вашего_типа_записи' );
