Отобразить иерархическую структуру произвольного типа записи в UL LI

Вопрос или проблема

У меня есть 2 настраиваемых типа записей “Sections” и “Articles”. Я хочу создать боковую навигацию, используя эти два типа записей.

“Section” — это настраиваемый тип записи, который представляет собой простую запись с заголовком страницы, который является полем отношения ACF в настраиваемом типе записи Article.

Article — это иерархический настраиваемый тип записи, который может иметь многоуровневую структуру дочерних записей.

Мне удалось получить все записи, совпадающие с мета-значением section_group (post_title настраиваемого типа записи section), но я хочу показать их в иерархической структуре до тех пор, пока не будет дочерних записей.

В приведенной ниже структуре 1,2,3 — это заголовки страниц из Sections. Под ними все статьи имеют пользовательское поле AFC (отношение).

Например:

  1. Начало работы

    • Родительская статья 1
      • Дочерняя статья
        • Правнук статья
      • Дочерняя статья
    • Родительская статья 2
  2. Что вам понадобится

    • Родительская статья 1
      • Дочерняя статья
      • Дочерняя статья
        • Правнук статья
      • Дочерняя статья
    • Родительская статья 2
    • Родительская статья 3
  3. Как это будет работать

    • Родительская статья 1
      • Дочерняя статья
        • Правнук статья
        • Правнук статья
        • Правнук статья
      • Дочерняя статья
        • Правнук статья
      • Дочерняя статья
      • Дочерняя статья

Я хочу, чтобы структура выглядела как выше.

Ниже приведен код, в котором сначала я сделал запрос по настраиваемому типу записи Section
затем я сопоставил это с отношением ACS статьи, используя meta_value
Это дает мне все дочерние и внучатые записи в одном LI.

<?php

    $sections = new WP_Query(
        array(
            'posts_per_page' => -1,
            'post_type' => 'sections',
            'order' => 'ASC',
        )
    );

    if ( $sections->have_posts() ) : ?>
        <ul class="list-unstyled main">
    <?php while ( $sections->have_posts() ) :
            $sections->the_post(); ?>
               <li>
                    <?php the_title() // Заголовок страницы из настраиваемого типа записи Section ?>


                    <?php $section_id = get_the_ID();
                    $articles = new WP_Query(
                        array(
                            'posts_per_page' => -1,
                            'post_type' => 'articles',
                            'order' => 'ASC',
                            'meta_query' => array(
                                array(
                                    'key' => 'section_group',
                                    'value' => $section_id,
                                    'compare' => 'LIKE'
                                )
                            )
                        )
                    ); ?>
                    <ul class="list-unstyled sub">
                    <?php           
                        if ( $articles->have_posts() ) :
                            while ( $articles->have_posts() ) :
                                $articles->the_post(); ?>

                                    <li class="this"><a href="https://wordpress.stackexchange.com/questions/343409/<?php the_permalink(); ?>"><?php the_title() ?></a></li>
                                     <!-- Закрытие подсписка LI -->
                    <?php  endwhile;
                        endif; ?>
                    </ul> <!-- Закрытие подсписка UL -->
               </li> <!-- Закрытие основного списка LI -->
    <?php endwhile; ?>
              </ul> <!-- Закрытие основного списка UL -->   
<?php   endif;

?>

Расширенное решение — это Walker. Но простейшее решение — это рекурсивная функция, которая будет работать так же, как Walker. Вы можете использовать её ниже:

function wpse343409_get_recursive_posts( $type="page", $parent_id = 0 ) { // родитель по умолчанию 0 означает только верхнеуровневые записи

    $posts = new WP_Query( array(
        'post_type' => $type,
        'posts_per_page' => -1,
        'post_parent' => $parent_id,
        'ignore_sticky_posts' => 1, // В случае закрепленных записей страница может попасть в бесконечный цикл
    ) );

    if( $posts->have_posts() ) :
        echo '<ul>';
        while( $posts->have_posts() ) : $posts->the_post();
            printf( '<li><a href="https://wordpress.stackexchange.com/questions/343409/%s">%s</a>', esc_url( get_permalink() ), esc_html( get_the_title() ) );
            wpse343409_get_recursive_posts( $type, get_the_ID() );
            echo '</li>';
        endwhile;
        echo '</ul>';
    endif;

}

wpse343409_get_recursive_posts( 'sections' );

.

Ответ или решение

Для создания иерархической структуры пользовательских типов записей "Секции" и "Статьи" в формате списка UL LI в WordPress, можно воспользоваться подходом, описанным ниже. Рассмотрим более подробно, какие шаги потребуется предпринять для достижения данной цели.

Шаги для реализации иерархической структуры

  1. Получение данных "Секции": Первым делом необходимо получить все записи пользовательского типа "Секции" — они будут верхним уровнем вашей навигации. Используйте WP_Query, чтобы извлечь эти посты.

  2. Отображение структурированной навигации: Для каждой секции необходимо извлечь соответствующие статьи, сохраняя иерархию. Достигается это за счет использования рекурсивной функции, наподобие wpse343409_get_recursive_posts. Она будет обращаться к записям типа "статья", проверяя наличие дочерних элементов и добавляя их в структуру соответственно.

  3. Рекурсивная функция: Рекурсивная функция позволяет обрабатывать иерархическую структуру записей. Она вызывает себя для каждого дочернего элемента, тем самым позволяя углубляться в дерево структуры и выводить дочерние и нижеуровневые записи в виде вложенных списков.

  4. Отображение ссылок: Не забудьте, что каждая статья должна вести на соответствующую страницу. Для этого используйте get_permalink() для получения ссылки, и get_the_title() для получения и отображения заголовка статьи.

Пример кода

Приведенный ниже код демонстрирует, как можно реализовать данную структуру:

function wpse343409_get_recursive_posts($post_type = 'articles', $parent_id = 0) {
    $args = array(
        'post_type' => $post_type,
        'posts_per_page' => -1,
        'post_parent' => $parent_id,
        'order' => 'ASC',
        'orderby' => 'menu_order',
    );

    $query = new WP_Query($args);
    if($query->have_posts()) : 
        echo '<ul>';
        while($query->have_posts()) : $query->the_post();
            echo '<li><a href="' . esc_url(get_permalink()) . '">' . esc_html(get_the_title()) . '</a>';
            wpse343409_get_recursive_posts($post_type, get_the_ID());
            echo '</li>';
        endwhile;
        echo '</ul>';
    endif;
    wp_reset_postdata();
}

// Использование для вывода
wpse343409_get_recursive_posts('sections');

Оптимизация для SEO

  • Заголовки и ссылки: Убедитесь, что заголовки статей и ссылок точно описывают их содержимое. Это важно как для пользователей, так и для поисковых систем.

  • Чистый код: Поддерживайте код чистым и организованным. Это способствует лучшей индексации сайтом и улучшенной работоспособности.

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

Оцените материал
Добавить комментарий

Капча загружается...