Как отображать связанные записи по категориям или пользовательским типам записей?
Я ищу лучший способ создания, вероятно, пользовательского типа записи, где можно фильтровать категории, связанные с этим пользовательским типом записи, в сайдбаре.
Вот сайт, над которым я работаю. Изначально профили студентов и доноров должны быть каким-то типом записи или категорией, которые могут динамически обновляться при создании нового профиля. Так, разделы "Здоровье и наука", "Успехи студентов" и "Творческое сообщество" имеют свои собственные наборы профилей.
Допустим, Джон Доу - новый профиль студента для раздела "Успехи студентов". Я могу пометить его, чтобы он отображался только на этой странице, но при просмотре его отдельной записи у меня возникают проблемы с отображением связанных категорий или профилей (в данном случае "Успехи студентов"). При просмотре профиля Джона Доу другие профили из раздела "Успехи студентов" должны отображаться в сайдбаре.
Я заметил, что WordPress использует один шаблон single.php, поэтому сайдбар, который у меня есть для файла single.php, используется и для профилей, чего мы не хотим.
В целом, если посмотреть разделы "Здоровье и наука", "Успехи студентов" и "Творческое сообщество", мне нужна аналогичная структура, но вместо 4-шагового процесса, который клиент должен выполнять при загрузке нового профиля, я хочу сделать всего один шаг.
В моей текущей настройке новый профиль добавляется как страница, затем в меню админ-панели нужно добавить этот профиль в меню вручную.
<?php
// Получаем 5 связанных записей из той же категории (исключая текущую запись)
$related = get_posts( array(
'category__in' => wp_get_post_categories($post->ID),
'numberposts' => 5,
'post_type' => 'news',
'post__not_in' => array($post->ID)
) );
// Если есть связанные записи, выводим их в списке
if( $related ) foreach( $related as $post ) {
setup_postdata($post); ?>
<li>
<?php the_post_thumbnail(); ?>
<a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a>
</li>
<?php }
// Сбрасываем данные поста
wp_reset_postdata(); ?>

Сначала вам нужно выполнить запрос с пользовательской таксономией или любым другим критерием, по которому вы хотите отобразить свои записи
function related_posts_by_taxonomy( $post_id, $taxonomy, $args=array() ) {
$query = new WP_Query();
$terms = wp_get_object_terms( $post_id, $taxonomy );
// Убедимся, что у текущей записи есть термины
if ( count( $terms ) ) {
$post_ids = get_objects_in_term( $terms[0]->term_id, $taxonomy );
$post = get_post( $post_id );
$post_type = get_post_type( $post );
$args = wp_parse_args( $args, array(
'post_type' => $type,
'post__in' => $post_ids,
'taxonomy' => $taxonomy,
'term' => $terms[0]->slug,
) );
$query = new WP_Query( $args );
}
// Возвращаем результаты в виде запроса
return $query;
}
Для вывода списка вы можете использовать следующий код
$related = related_posts_by_taxonomy( $post->ID, 'service_category' );
while ( $related->have_posts() ): $related->the_post(); ?>
<li class="folk-grid__col all">
<img class="" data-src="<?php echo get_template_directory_uri(); ?>/images/icons-service/<?php $icon_service = get_post_meta( $post->ID, 'service_options_icons', true ); echo $icon_service; ?>.svg" alt="<?php echo get_the_title( $post->ID ); ?>" src="<?php echo get_template_directory_uri(); ?>/images/icons-service/<?php echo $icon_service; ?>.svg">
<span><a href="<?php echo esc_url( get_permalink( $post->ID ) ); ?>"><?php echo get_the_title( $post->ID ); ?></a></span>
<div>
<a rel="nofollow" class="btn folk-button" style="top: 35%;width: 62%;padding: 10px;" href="<?php echo esc_url( get_permalink( $post->ID ) ); ?>">Узнать подробности</a>
</div>
</li>
endwhile;
