Отображение категорий, подкатегорий и постов в них

15 июн. 2017 г., 03:57:05
Просмотры: 18.9K
Голосов: 0

Как следует из заголовка, мне нужно получить список категорий и подкатегорий, а затем посты (с ссылками на них) для этих категорий/подкатегорий.

Вот структура, которую я пытаюсь реализовать:

  • Категория 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 и мне действительно нужна помощь с этим.

0
Все ответы на вопрос 2
8

Обновление: Полный код

<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>
15 июн. 2017 г. 10:21:10
Комментарии

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

Karadjordje Karadjordje
15 июн. 2017 г. 10:33:03

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

Bikash Waiba Bikash Waiba
15 июн. 2017 г. 10:35:52

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

Karadjordje Karadjordje
15 июн. 2017 г. 10:43:05

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

Karadjordje Karadjordje
15 июн. 2017 г. 10:49:53

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

Bikash Waiba Bikash Waiba
15 июн. 2017 г. 10:52:45

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

Bikash Waiba Bikash Waiba
15 июн. 2017 г. 10:57:16

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

Karadjordje Karadjordje
15 июн. 2017 г. 10:59:58

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

Bikash Waiba Bikash Waiba
15 июн. 2017 г. 11:06:22
Показать остальные 3 комментариев
0

Эта функция работает сразу, просто убедитесь, что изменили названия на свою таксономию и тип записи. Читайте комментарии для дополнительных пояснений.

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( 'название_вашей_таксономии', 'название_вашего_типа_записи' );
3 янв. 2019 г. 04:18:07