Как отображать связанные записи по категориям или пользовательским типам записей?

26 июн. 2014 г., 17:17:15
Просмотры: 15.1K
Голосов: 1

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

Вот сайт, над которым я работаю. Изначально профили студентов и доноров должны быть каким-то типом записи или категорией, которые могут динамически обновляться при создании нового профиля. Так, разделы "Здоровье и наука", "Успехи студентов" и "Творческое сообщество" имеют свои собственные наборы профилей.

Допустим, Джон Доу - новый профиль студента для раздела "Успехи студентов". Я могу пометить его, чтобы он отображался только на этой странице, но при просмотре его отдельной записи у меня возникают проблемы с отображением связанных категорий или профилей (в данном случае "Успехи студентов"). При просмотре профиля Джона Доу другие профили из раздела "Успехи студентов" должны отображаться в сайдбаре.

Я заметил, что WordPress использует один шаблон single.php, поэтому сайдбар, который у меня есть для файла single.php, используется и для профилей, чего мы не хотим.

В целом, если посмотреть разделы "Здоровье и наука", "Успехи студентов" и "Творческое сообщество", мне нужна аналогичная структура, но вместо 4-шагового процесса, который клиент должен выполнять при загрузке нового профиля, я хочу сделать всего один шаг.

В моей текущей настройке новый профиль добавляется как страница, затем в меню админ-панели нужно добавить этот профиль в меню вручную.

Мой текущий код шаблона страницы.

7
Комментарии

Итак, по сути, вам нужно, чтобы сайдбар в single.php определял пост, который загружается в шаблоне страницы, и использовал категорию или тип записи, чтобы определить, какие связанные профили/посты показывать? То есть сейчас Health & Science, Student Success и Creative community — это просто страницы с шаблонами, а не пользовательский тип записей?

RachieVee RachieVee
26 июн. 2014 г. 18:08:31

Да. Я изучал условные операторы, которые использует WordPress, но не могу понять, как заставить его прочитать эту страницу и показать связанные записи.

jose jose
26 июн. 2014 г. 20:15:28

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

RachieVee RachieVee
27 июн. 2014 г. 17:32:22

Спасибо за помощь, @RachieVee. Если это начнет отнимать слишком много времени, не беспокойся об этом. Спасибо!

jose jose
27 июн. 2014 г. 18:03:33

Ох, ха-ха, да, это занимает у меня некоторое время, но если ты не против, что я не предоставляю код, я могу хотя бы попытаться направить тебя в правильном направлении. Я вижу, что в твоем шаблоне ты делаешь запрос постов по категории - почему бы не создать новый цикл в разделе "Профили доноров", который будет получать посты этой категории и выводить ссылки (предполагая, что категория называется что-то вроде "Здоровье-Наука" или одна из трех секций)? Или ты можешь использовать мета-данные постов в профилях, если не хочешь вытягивать категорию для меню, созданного с помощью цикла get_posts. Кажется, я не очень понятно объяснил? Дай знать.

RachieVee RachieVee
27 июн. 2014 г. 18:21:07

Не переживай, чувак. У меня довольно большой опыт кодинга на WordPress. Моя проблема в том, что если я использую функционал постов в WordPress и создаю определенные категории для этих профилей, WordPress использует шаблон single.php для всех постов. Так что пост в разделе "Новости и события" будет иметь ту же боковую панель, что мне не нужно. Я хочу, чтобы боковая панель в "Новостях и событиях" оставалась как сейчас, но показывала связанные посты для профилей. Так что я пытаюсь понять, как динамически определять категорию текущей страницы, чтобы отображать связанные категории в левой боковой панели. Иногда мне кажется, что я несу чепуху, ха-ха.

jose jose
27 июн. 2014 г. 20:39:16

Хм, а что если манипулировать классом body, если он еще не отображает категорию как класс - и использовать это как способ определения категории в сайдбаре, контролируя вывод сайдбара проверкой этого класса категории на body? Я полагал, что ваши профили отображаются на странице, так что разве только отдельные записи используют single.php? Думаю, это также зависит от вашей темы...

RachieVee RachieVee
30 июн. 2014 г. 07:06:49
Показать остальные 2 комментариев
Все ответы на вопрос 2
2
<?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(); ?>
9 сент. 2014 г. 07:14:07
Комментарии

Как это отвечает на вопрос?

Rarst Rarst
9 сент. 2014 г. 09:56:50

Это сработало у меня..

rwzdoorn rwzdoorn
15 июл. 2015 г. 14:42:59
0

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

  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; 
13 июл. 2021 г. 20:58:58