GeneratePress hook으로 관련 글 목록 만드는 방법

블로그 글 본문에 같은 카테고리 글 목록이 있으면 방문자는 조금 쉽게 다른 글에 접근해 읽을 수 있다. 네이버 블로그라면 메뉴·글 관리에서 ‘목록 열기’를 하면 되고 티스토리는 ‘카테고리 글 더보기’ 플러그인을 설정하면 된다.

워드프레스는 자체적인 설정 메뉴가 따로 없는데 (테마에 따라 지원할 수 있음) 플러그인을 사용하거나 코드를 구현하는 방법을 통해 설정하면 된다.

지금 이 블로그는 GeneratePress 테마 프리미엄 버전을 적용 중인데 프리미엄에서 지원하는 Elements – hook 기능을 이용해 직접 관련 글 코드를 추가하였다. 같은 GP 테마를 적용 중이라면 아래 코드를 참고해서 관련 글 목록을 추가할 수 있다.

* GP 테마 프리미엄 라이센스 키 적용 후 Module에서 Elements 활성화가 필요하다.


관련 글 목록 만드는 방법

설정을 위해 워드프레스 대시보드 – Elements – Add New Element 버튼을 클릭한 다음, 엘리먼트 타입을 hook으로 해서 Create를 진행하자.


화면이 열리면 위에서부터 순서대로 진행하면 된다.
– Element의 이름 입력
– 관련 글 목록 코드 입력
– Hook : 해당 목록을 적용할 블로그 내 위치를 지정한다.
(Generate_after_do_template_part를 선택하면 본문 글 영역 아래 적용되는데, 원하는 위치에 따라 문구 선택이 달라질 수 있다.
– Execute PHP : 항목을 체크해야 한다.

코드는 아래 영역에서 복사 붙여 넣은 다음 hook 화면의 Display Rules로 이동하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<div class=“related-posts”>
 
    <h5>
    <?php
    $queried_category = get_queried_object();
    $categories = get_the_category();
    $current_post_id = get_the_ID();
 
    if (!empty($categories)) {
        $display_category = null;
 
        if (is_category() && !empty($queried_category>term_id)) {
            $display_category = $queried_category;
        } else {
            foreach ($categories as $category) {
                if ($category>parent != 0) {
                    $display_category = $category;
                    break;
                }
            }
            if (empty($display_category)) {
                $display_category = $categories[0];
            }
        }
 
        if ($display_category) {
            if ($display_category>parent != 0) {
                // 서브 카테고리인 경우
                $parent_category = get_category($display_category>parent);
                if ($parent_category) {
                    // 링크 적용
                    echo ‘<a href=”‘ . esc_url(get_category_link($parent_category>term_id)) . ‘”>’ . esc_html($parent_category>name) . ‘</a> » ‘;
                    echo ‘<a href=”‘ . esc_url(get_category_link($display_category>term_id)) . ‘”>’ . esc_html($display_category>name) . ‘</a> 카테고리의 다른 글’;
                } else {
                    // 부모가 없을 때
                    echo ‘<a href=”‘ . esc_url(get_category_link($display_category>term_id)) . ‘”>’ . esc_html($display_category>name) . ‘</a> 카테고리의 다른 글’;
                }
            } else {
                // 메인 카테고리일 때
                echo ‘<a href=”‘ . esc_url(get_category_link($display_category>term_id)) . ‘”>’ . esc_html($display_category>name) . ‘</a> 카테고리의 다른 글’;
            }
        }
    } else {
        echo ‘관련 글’;
    }
    ?>
</h5>
 
    <?php
    $category_id_to_query = 0;
 
    if (is_category() && !empty($queried_category>term_id)) {
        $category_id_to_query = $queried_category>term_id;
    } elseif (!empty($categories)) {
        foreach ($categories as $category) {
            if ($category>parent != 0) {
                $category_id_to_query = $category>term_id;
                break;
            }
        }
        if ($category_id_to_query == 0) {
            $category_id_to_query = $categories[0]>term_id;
        }
    }
 
    if ($category_id_to_query != 0) {
        $query_args = array(
            ‘cat’            => $category_id_to_query,
            ‘post_type’      => ‘post’,
            ‘posts_per_page’ => 100// 일단 많이 가져온다 (최대 100개, 필요시 조절)
            ‘orderby’        => ‘date’,
            ‘order’          => ‘DESC’// 최신 글부터 나오게
        );
 
        $all_related_posts = new WP_Query($query_args);
 
        if ($all_related_posts>have_posts()) :
            $posts_list = array();
            while ($all_related_posts>have_posts()) : $all_related_posts>the_post();
                $posts_list[] = array(
                    ‘ID’    => get_the_ID(),
                    ‘title’ => get_the_title(),
                    ‘link’  => get_permalink()
                );
            endwhile;
            wp_reset_postdata();
 
            // 현재 글 위치 찾기
            $current_index = array_search($current_post_id, array_column($posts_list‘ID’));
 
            // 주변 글 8개 가져오기
            $start = max(0$current_index  3);
            $related_posts = array_slice($posts_list$start8);
 
            if (!empty($related_posts)) :
                ?>
                <ul>
                    <?php
                    foreach ($related_posts as $post_item) {
                        $is_current = ($post_item[‘ID’== $current_post_id);
                        ?>
                        <li>
                            <a href=“<?php echo esc_url($post_item[‘link’]); ?>”>
                                <?php if ($is_current) : ?>
                                    <strong><?php echo esc_html($post_item[‘title’]); ?></strong>
                                <?php else : ?>
                                    <?php echo esc_html($post_item[‘title’]); ?>
                                <?php endif; ?>
                            </a>
                        </li>
                        <?php
                    }
                    ?>
                </ul>
            <?php endif;
        endif;
    }
    ?>
 
</div>
cs


[코드 설명]
– 관련 글 목록은 최대 8개 표시
– 현재 글 제목은 관련 글 목록에서 진하게 표시되며 위 아래로 각 이전/다음 글 목록 표시
– 같은 카테고리 내 글 목록은 최신 작성 순서대로 표시 (위 → 아래)
– 메인 + 서브 카테고리 지정 글은 해당 서브 카테고리 글 목록 표시
– 서브 카테고리 지정이 안 된 글은 메인 카테고리 글 목록 표시

* 위 코드는 챗 – GPT(무료 버전)에게 여러 차례 질문 후 완성하였습니다. 코드 수정이 필요할 땐 GPT나 다른 AI에게 확인 해주세요.

Location을 Post – All Post로 하면 블로그 내 모든 포스팅에 적용된다. 만약 원하는 특정 페이지나 제외 페이지가 있다면 Location과 Exclude를 통해 추가하자.

코드 적용을 마치면 위처럼 관련 글 목록이 잘 표시된다. 참고로 서브 카테고리 지정 글 목록은 위처럼 [‘메인 > 서브’ 카테고리의 다른 글]로 나타나는데 메인과 서브 클릭 시 관련 전체 글 목록으로 이동한다.

이대로 사용하기에는 디자인이 아쉬우니 CSS를 추가해보았다.

디자인은 티스토리 ‘카테고리 글 더보기’와 비슷하게 진행했고 아래 CSS 코드를 추가하였다. 참고로 위 디자인은 GP 프리미엄 마케터 테마 적용 모습인데, 지금 적용한 테마나 취향에 따라 CSS 값을 수정하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* Post Related Post */
div.related-posts {
background-color : #FFFFFF;
border-radius: 10px;
padding: 20px 20px;
padding-bottom: 2px;
}
div.related-posts h5 {
    font-weight: 600;
 color: #676767;
 padding: 10px 0 0 7px;
}
div.related-posts li {
  display: block;
    line-height: 35px;
  list-style: none;
  word-break: keep-all;
}
@media (max-width: 768px) {
div.related-posts li {
    line-height: 30px;
  margin-bottom: 5px;
    }
}
cs


GP 테마 CSS는 대시보드 – Appearance – Customize – Additional CSS에 추가 후 저장하면 된다.

관련 글
워드프레스 꼭 비싼 테마를 사는 것이 좋을까
GeneratePress 마케터 테마 선택 이유와 설치 방법
GP 마케터 테마 사이드바 카테고리 목록 추가하는 방법
Post Navigation으로 이전글 다음글 버튼 만드는 방법

Leave a Comment