워드프레스 이전 글 다음 글 카테고리 내에 표시하는 방법
워드프레스 블로그 하단에 이전 글과 다음 글을 표시하는 부분을 가만히 보니.. 당연히 카테고리 내에서 앞 뒤 글이 표시 될 줄 알았는데, 워프 에서는 그냥 글이 발행 된 순서대로, 새로 추가 된 글이 뜨더군요.
좀 일관성이 없어 보여 같은 카테고리에 있는 글들 순서로 이전 글과 다음 글을 표시하는 방법은 없을까? 했는데..
다행히 있었습니다.
블로그의 게시물들이 아주 같지는 않더라도 서로 비슷한 주제에 대해 다룬 다면 별 상관없이 크게 거슬리지 않을 수도 있겠지만,
만약 예를 들어 컴퓨터 관련 카테고리 글을 하나 발행하고, 그 다음 날 전혀 상관없는 ‘나 어디서 뭐 했다’ 라는 지극히 일상적인 잡글을 하나 쓸 경우, 다음 글로 먼저 쓴 컴퓨터 관련 글과 상관 없는 오늘 쓴 아무개 글이 표시 된다는 거죠.
제가 쓰는 테마의 경우, 이런 식의 위젯 형태로 표시되고 있는데요,
대부분의 워프 테마에서 지원하는 기능으로 알고 있습니다.
이 부분의 다음 글을 글 발행 날짜와 상관 없이
카테고리 내에서만 이전/다음 글로 표시되게 하는 필터 소스입니다.
add_filter( 'get_next_post_join', 'navigate_in_same_taxonomy_join', 20);
add_filter( 'get_previous_post_join', 'navigate_in_same_taxonomy_join', 20 );
function navigate_in_same_taxonomy_join() {
global $wpdb;
return " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";
}
add_filter( 'get_next_post_where' , 'navigate_in_same_taxonomy_where' );
add_filter( 'get_previous_post_where' , 'navigate_in_same_taxonomy_where' );
function navigate_in_same_taxonomy_where( $original ) {
global $wpdb, $post;
$where = '';
$taxonomy = 'category';
$op = ('get_previous_post_where' == current_filter()) ? '<' : '>';
$where = $wpdb->prepare( "AND tt.taxonomy = %s", $taxonomy );
if ( ! is_object_in_taxonomy( $post->post_type, $taxonomy ) )
return $original ;
$term_array = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );
$term_array = array_map( 'intval', $term_array );
if ( ! $term_array || is_wp_error( $term_array ) )
return $original ;
$where = " AND tt.term_id IN (" . implode( ',', $term_array ) . ")";
return $wpdb->prepare( "WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish' $where", $post->post_date, $post->post_type );
}
해당 코드를 복사하여 테마 내에 functions.php 파일 내 적당한 곳에 넣어 주면 끄읏~간단하게 해결이 되었습니다.
코드 적용 후 확인해 보니 잘 작동되는 군요, 관련 글을 표시해 같이 쓰면 중복되는 면도 없지 않아 있지만 그래도 아주 엉뚱한 주제의 글이 나오는 것 보다 나은 것 같으니 필요하신 분들은 한 번 적용해 보시길 바랍니다.