워드프레스 동일 카테고리 내에서 이전/다음 글로 이동하도록 제한하기

Last Updated: 2020년 03월 05일 12개 댓글

워드프레스 개별 글 하나에 사용하는 테마에 따라 이전 글, 다음 글로 이동하는 내비게이션이 표시될 수 있습니다. 보통 이전 글/다음 글 링크를 클릭하면 카테고리에 관계 없이 이전 글 또는 다음 글로 이동하게 됩니다. 동일 카테고리 내에서만 이동하도록 하고 싶은 경우가 있을 수 있습니다.

[ 이 글은 2020년 3월 5일에 최종 업데이트되었습니다. ]

동일 카테고리 내에서 이전 글 / 다음 글로 이동하는 제한하는 방법

워드프레스에서 previous_post_link 함수와 next_post_link 함수를 사용하여 개별 글에서 이전 글과 다음 글로 이동할 수 있는 내비게이션을 추가할 수 있습니다. 보통은 카테고리에 관계 없이 블로그 글을 발행한 시점을 기준으로 이전 글/다음 글로 이동하게 됩니다. (이전 글/다음 글 탐색 기능의 표시 여부를 테마에서 옵션을 제공하는 경우가 있습니다.)

같은 카테고리 내에서만 이동하도록 하고 싶은 경우 다음과 같은 사용자 함수를 테마의 함수 파일에 추가하여 테스트해보시기 바랍니다.

// 워드프레스 글 하단에 표시되는 이전 글/다음 글 내비게이션을 카테고리로 제한
// Restrict the post navigation to the same category
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 );
}
// Source: https://presscustomizr.com/

위의 코드를 사용 중인 워드프레스 테마의 자식 테마를 만들어 자식 테마 내에 있는 functions.php 파일에 추가하면 됩니다. 자세한 방법은 이 글을 참고해보세요.

위의 방법이 잘 안 되면 이 글에 나와 있는 코드로 시도해보시기 바랍니다. 링크된 글에서는 테마의 소스 파일(예: single.php)에서 직접 추가하는 방법이네요. 마찬가지로 차일드 테마를 만들어서 작업하시기 바랍니다.

이 글을 작성할 당시 이 블로그에 사용하던 Pluto 테마에서는 위의 코드를 적용하니까 잘 작동했습니다. 하지만 위의 코드 스니펫은 오래되었기 때문에 최신 워드프레스 버전에서 제대로 작동하는지는 장담할 수 없습니다.

대안 1: 관련 글 리스트 표시하기

이전 글/다음 글 내비게이션을 개별 포스트 하단에 표시하는 대신 관련 글(연관 글) 리스트를 표시하는 것을 고려해볼 수 있습니다. 아바다, 뉴스페이퍼 같은 테마에서는 관련 글을 표시하는 기능을 제공합니다.

테마에서 연관 글을 표시하는 옵션을 제공하지 않는 경우에는 플러그인을 사용해볼 수 있습니다. 예를 들어, 현재 이 블로그에 설치되어 있는 GeneratePress 테마에는 기능을 최소화하여 속도는 빠르지만 관련 글 목록을 표시하는 기능이 없습니다. 이 경우 다음 글에서 소개하는 관련 글 관련 플러그인(예: WP Show Posts)을 활용해볼 수 있습니다.

대안 2: 구글 애드센스의 일치하는 콘텐츠 광고 표시하기

다른 방법으로 구글 애드센스의 일치하는 콘텐츠 광고를 이전 글/다음 글 내비게이션이나 관련 글 리스트 대신 활용해볼 수 있습니다. 이 블로그에서는 현재 관련 글 대신 애드센스의 '일치하는 콘텐츠 광고'를 표시하고 있습니다.

이전 글/다음 글 내비게이션 대신 일치하는 콘텐츠 광고 표시.
이 블로그에는 현재 일치하는 콘텐츠 광고가 표시되고 있다.

일치하는 콘텐츠 광고를 표시하면 위의 그림과 같이 애드센스 배너 광고와 함께 관련 글이 함께 표시됩니다.

참고:


12 개 댓글

Leave a Comment

  1. 안녕하세요 선생님!
    다름이 아니라 워드프레스 아스트라 테마를 사용하고 있는데요,
    글을 하나 읽으면 그 아래 바로 다음글이 자동적으로 나와서 읽을 수 있도록 하려면 어떻게 해야 할까요?

    응답
  2. 카테고리내에서 이동하기에서 개별 php 파일 수정하려고 제 어느 부분 코드를 어떻게 변경하면 좋을찌 문의드립니다.

    제 코드는

    <?php next_post_link( '%link', _x( '← Newer Item', 'gallery', 'risen' ) ); ?>
    <?php previous_post_link( '%link', _x( 'Older Item →', 'gallery', 'risen' ) ); ?>

    응답
    • 개별 글에서 이전글, 다음글 링크가 표시되지 않는 것 같네요. 맞나요?

      이것도 아마 테마 옵션 내에서 조정하는 것이 있지 않을까요?
      만약 없다면 테마 소스 파일에 직접 코드를 추가하셔야 할 것 같습니다.

      차일드 테마를 만든 다음, single.php 파일(테마에 따라 다름)을 차일드 테마 폴더 아래로 복사한 후에 적절한 위치에 다음 코드를 추가하면 될 것입니다.

      |

      응답
      • 매번 고맙습니다. 제가 때때로 구* ㅇㄷ센* *고 꾹꾹 누르고 가는거 알고 계시지요?^^^^
        사실 이제까지 장님 코끼리 더듬는 것 처럼 하느라 저도 무척 답답했습니다.
        도서관에서 책 하나 빌려왔습니다. 좀 나아지면 좋겠습니다.

      • 감사합니다~

        워드프레스와 관련하여 문의사항이 있으시면 언제든지 댓글로 달아주시면 아는 범위 내에서 알려드리도록 노력하겠습니다.ㅎㅎ

  3. 감사합니다. 저도 방금 적용했는데, 바로 적용이 되었습니다.
    해외라 후원은 못 해드리지만, 자주 들어와서 구글 애드센스라도 클릭하겠습니다.
    감사합니다!

    응답
  4. 제 블로그는 특성상 웹툰종류가 몇개 있는데, 항상 다음글을 누르면
    전체 카테고리의 다음글로 넘어가서 불편했었거든요...

    저에게 꼭 필요한 기능이였는데, 이렇게 설명해 주셔서 감사드립니다!

    지금 당장 꼭 적용해 보도록 하겠습니다!!!

    항상 많이 배운답니다! 행복한 하루 보내세요!!!

    응답