Вопрос или проблема
У меня есть 2 настраиваемых типа записей “Sections” и “Articles”. Я хочу создать боковую навигацию, используя эти два типа записей.
“Section” — это настраиваемый тип записи, который представляет собой простую запись с заголовком страницы, который является полем отношения ACF в настраиваемом типе записи Article.
Article — это иерархический настраиваемый тип записи, который может иметь многоуровневую структуру дочерних записей.
Мне удалось получить все записи, совпадающие с мета-значением section_group (post_title настраиваемого типа записи section), но я хочу показать их в иерархической структуре до тех пор, пока не будет дочерних записей.
В приведенной ниже структуре 1,2,3 — это заголовки страниц из Sections. Под ними все статьи имеют пользовательское поле AFC (отношение).
Например:
-
Начало работы
- Родительская статья 1
- Дочерняя статья
- Правнук статья
- Дочерняя статья
- Дочерняя статья
- Родительская статья 2
- Родительская статья 1
-
Что вам понадобится
- Родительская статья 1
- Дочерняя статья
- Дочерняя статья
- Правнук статья
- Дочерняя статья
- Родительская статья 2
- Родительская статья 3
- Родительская статья 1
-
Как это будет работать
- Родительская статья 1
- Дочерняя статья
- Правнук статья
- Правнук статья
- Правнук статья
- Дочерняя статья
- Правнук статья
- Дочерняя статья
- Дочерняя статья
- Дочерняя статья
- Родительская статья 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, можно воспользоваться подходом, описанным ниже. Рассмотрим более подробно, какие шаги потребуется предпринять для достижения данной цели.
Шаги для реализации иерархической структуры
-
Получение данных "Секции": Первым делом необходимо получить все записи пользовательского типа "Секции" — они будут верхним уровнем вашей навигации. Используйте
WP_Query
, чтобы извлечь эти посты. -
Отображение структурированной навигации: Для каждой секции необходимо извлечь соответствующие статьи, сохраняя иерархию. Достигается это за счет использования рекурсивной функции, наподобие
wpse343409_get_recursive_posts
. Она будет обращаться к записям типа "статья", проверяя наличие дочерних элементов и добавляя их в структуру соответственно. -
Рекурсивная функция: Рекурсивная функция позволяет обрабатывать иерархическую структуру записей. Она вызывает себя для каждого дочернего элемента, тем самым позволяя углубляться в дерево структуры и выводить дочерние и нижеуровневые записи в виде вложенных списков.
-
Отображение ссылок: Не забудьте, что каждая статья должна вести на соответствующую страницу. Для этого используйте
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
-
Заголовки и ссылки: Убедитесь, что заголовки статей и ссылок точно описывают их содержимое. Это важно как для пользователей, так и для поисковых систем.
-
Чистый код: Поддерживайте код чистым и организованным. Это способствует лучшей индексации сайтом и улучшенной работоспособности.
Следуя этим инструкциям, вы сможете создать эффективную, хорошо структурированную иерархическую навигацию на своем сайте, что улучшит пользовательский опыт и видимость сайта в поисковых системах.