얼마전 등록한 워드프레스 2.7 이후의 댓글 출력 환경글에서 나아가 좀 더 입맛에 맞는 댓글 출력 환경을 제공하는 몇가지 방법을 소개해 보려 한다.
관련 글
- 워드프레스 2.7 이후의 댓글 환경 첫번째
- 댓글과 트랙백(핑백)의 분리(현재 글)
- 댓글 페이지 탐색을 번호로 표시하기(준비중)
- Rely(응답) 링크 자바스크립트 적용(준비중)
댓글과 트랙백의 분리
아직은 구현하는데 불편함이 있어 일반 이용자 보다는 테마제작자에게 그 기능을 활용 할 것을 제안하고 있다는 느낌을 주고 있는 기능이 있는데, 그 중 개인적으로 관심이 가는 것은 댓글과 트랙백(핑백)을 나눠주는 기능이다.
wp_list_comments() 함수를 살펴본 적이 있다면 알 수 있듯이, 함수 자체에서도 일반 댓글과 트랙백 중 원하는 것만 출력해 줄 수 있는 'type' 이라는 설정변수를 가지고 있다.
$defaults = array('walker' => null, 'max_depth' => ", 'style' => 'ul', 'callback' => null, 'end-callback' => null, 'type' => 'all',
'page' => ", 'per_page' => ", 'avatar_size' => 32, 'reverse_top_level' => null, 'reverse_children' => ");
또한, 댓글 템플릿을 불러오는 comments_template() 함수에서도 댓글을 종류별로 분리할 것인지를 지정하는 설정변수가 존재한다.
function comments_template( $file = '/comments.php', $separate_comments = false ) {
즉, 따로 플러그인을 만들거나 함수를 만들지 않아도 기본적으로 댓글과 트랙백을 분리 할 수 있는 것이다.
이제, 댓글과 트랙백을 분리하는 작업을 시작해 보기로 하자.
single.php(page.php) 파일 수정
우선, 템플릿 파일('/comments.php')파일을 불러 올 때, 댓글과 트랙백을 분리해서 출력할지도 모르니 댓글들을 미리 분리해 놓으라고 해 둘 필요가 있다. 물론 미리 말 해 두지 않아도 되지만, 미리 지정해 두는게 좋다.
여기서는 single.php 만을 설명하지만, 사용중인 테마의 템플릿 파일들중 함수가 포함된 파일이 있다면 모두 수정하도록 한다.
single.php 파일을 열어 <?php comments_template(); ?> 부분을 찾아 아래와 같이 수정한다.
<?php comments_template(", true); ?>
comments.php 파일 수정
우선 지난 글에서 댓글 목록 출력부분을 2.7에 맞게 수정하였다면 아래와 같을 것이다.
<ol class="commentlist">
<?php wp_list_comments(); ?>
</ol>
이 목록에서는 우선 댓글만 출력하기로 하고 아래와 같이 type 변수를 추가한다. 테마에 따라서 기본적으로 다른 설정 변수가 있을 수도 있으나.
<ol class="commentlist">
<?php wp_list_comments('type=comment'); ?>
</ol>
이제 그 아래 또는 위 중 원하는 곳에 트랙백(핑백)의 목록을 출력하는 내용을 추가하면된다. 참고로, 핑백과 트랙백 또한 분리하여 출력 할 수 있지만 여기서는 두가지를 함께 출력하기로 하자. (핑백: type=pingback, 트랙백: type=trackback, 핑백+트랙백: type=pings)
<ol class="pinglist">
<?php wp_list_comments('type=pings'); ?>
</ol>
'ol'의 클래스(class)를 지정할 때 댓글 목록과 트랙백(핑백) 목록을 똑같이 출력하려면 댓글과 같이 class="commentlist" 라고 지정하면 되지만, 이와 다르게 출력하려면 class="pinglist" 와 같이 구분하여 줄 필요가 있다.
여기서 생각해 봐야 할 문제가 생긴다. 보통은 if (have_comments()) 조건을 통해서 댓글이 존재하는지 확인하고 없다면 'No comments(댓글이 없습니다)' 등의 문구를 표현하는데, 댓글과 트랙백(핑백)을 분리해 놓았으니, 각각에 내용물이 있는지를 또 확인해 줘야만 한다는 것이다.
예를들어 해당 글에 댓글은 없고 트랙백만 존재한다면 댓글 목록 부분은 HTML 에러를 발생하면서 목록을 감싸주는 태그만 덩럴 남아있게 되는 것이다.
<ol class="commentlist">
</ol>
이 문제를 해결하기 위해서, 댓글 목록 출력 부분과 트랙백(핑백)목록 출력 부분을 아래와 같이 조건을 붙여 감싸준다.
<?php if (!empty($wp_query->comments_by_type['comment'])) { ?>
<ol class="commentlist">
<?php wp_list_comments('type=comment'); ?>
</ol>
<?php } ?>
<?php if (!empty($wp_query->comments_by_type['pings'])) { ?>
<ol class="pinglist">
<?php wp_list_comments('type=pings'); ?>
</ol>
<?php } ?>
여기까지만 해도 일단, 댓글과 트랙백(핑백)이 분리되어 표시되긴 하지만, 아직은 살짝 모자란 감이 있는 듯 하다. 우선, 댓글은 등록자가 사람이고? 트랙백(핑백)은 등록자가 어떤 사람이 등록한 글이 되기 때문에, 댓글 등록자의 이름 부분이 상대적으로 굉장히 길어지는 경우도 많고, 내용 또한 그러하다.
트랙백(핑백) 목록 출력 방식 변경
wp_list_comments() 함수에서는 목록의 출력을 좀 더 유연하게 하기 위하여 callback, end-callback 설정 변수를 제공하고 있다. 이 변수에 자신이 등록한 함수의 이름을 등록하면, 목록내의 개별 댓글의 출력 방식을 자신의 함수로 대체 할 수 있게된다.
우선 개별 트랙백(핑백)의 출력 내용이 간단하게 아래와 같다고 가정해 보자.
<li>트랙백 발송한 블로그 | 트랙백 등록시간 | 편집</li>

사용중인 테마폴더에서 functions.php파일을 열어(없다면 새로 한 만들면 된다.) 맨 아래에(또는 원하는 곳에) 아래와 같은 새로운 함수를 하나 추가한다.
(함수 이름은 입맛에 맞게 지정해 주면 됨)
function my_theme_ping_start_el($comment, $args = array(), $depth = 1) {
global $user_ID;
$GLOBALS['comment'] = $comment;
extract($args, EXTR_SKIP);
?>
<li <?php comment_class(); ?> id="comment-<?php comment_ID() ?>">
<span><?php comment_author_link() ?> |
<?php if ($comment->comment_approved == '0') { ?><em>Your comment is awaiting moderation.</em><?php } ?>
<a href="#comment-<?php comment_ID() ?>" title="Permallink to this comment"><?php comment_date('F jS, Y') ?>, <?php comment_time() ?></a></span>
<?php edit_comment_link('Edit','| <span class="editcomment">','</span>'); ?>
<?php
}
이제, wp_list_comments 함수에 자신이 등록한 함수를 callback 변수에 넣어주면 된다.
<ol class="pinglist">
<?php wp_list_comments('type=pings&callback=my_theme_ping_start_el'); ?>
</ol>
좀 더 자신의 입맛에 맞게 바꾸려면 워드프레스 댓글 템플릿 함수 페이지를 참고해서 도전해 보세요.
by 082net at 2009년 04월 30일,04:13 PM under wordpresstips