상현에 하루하루
All 개발자의 하루

아카이브 포스트에 번호 표시하기

( 업데이트: )

WordPress는 게시물에 대해서 고유하게 부여되는 ID값이 있습니다. 어떻게 보면 게시판에 각각의 글들이 고유한 ID값이 있어서 이 값을 가지고 포스트 번호라 칭해서 보여줘도 되겠다 생각하면 의도한대로 보여지지 않을 겁니다. 게시판의 각각의 글들을 순서대로 번호가 매겨져야하는데 고유한 ID는 그렇게 보여지지 않거든요

그러면 어떻게 아카이브에 포스트 번호를 오름, 내림 차순으로 적절하게 조정해야하나?

  1. 특정 게시물 타입에 게시된 게시물의 총 수를 가져옵니다
  2. WordPress 루프를 반복하면서 역으로 계산
  3. 페이징된 아카이브를 통해 번호를 적절하게 조정한다

wp_count_posts

wp_count_posts() | Function | WordPress Developer Resources 이를 통해서 특정 게시물 타입에 대한 모든 포스트의 갯수를 가져올 수 있습니다.

게시물 상태에 관계없이 모든 게시물의 총 수 가져오기

$post_count = wp_count_posts();

위와 같이 기본적으로 인자가 없다면 post 타입의 글을 가져오게 됩니다. 인자로 원하는 타입을 넣어주면 해당 타입의 게시물의 총 수를 가져올 수 있습니다.

$post_count = wp_count_posts( 'post' );

게시된 모든 게시물의 총 수 가져오기

$post_count_published = wp_count_posts()->publish;

public하게 공개된 포스트의 갯수를 가져옵니다.

wp 루프에서 역으로 계산

아카이브에서 총 포스트의 수를 가지고 템플릿 파일에서 사용합니다.

// 게시된 충 포스트의 갯수
$post_count = wp_count_posts( 'custom_type' )->publish;

// start loop
while ( have_posts() ) : the_post();
  // 포스트에 대한 아이템 ui 만들기
  <!-- code -->
  
  // Decrease counter
  $post_count--;
endwhile;

while 루프내에서 $post_count를 사용해서 포스트의 번호를 매길 수 있습니다.

Pagination과 같이 작동하게 구현

번호 매김은 재대로 동작하지만 아카이브페이지에서 페이지를 넘어가서 탐색할 때 문제가 됩니다.

두 번째 페이지의 카운트가 첫 번째 페이지에 있는 것처럼 표시가 되는 겁니다? 왜 그럴까요? 우리는 계산 기능이 우리가 어떤 페이지에 있는지 인식하지 못하게 했습니다.

페이지 번호 가져오기

먼저 루프 앞에 다음을 붙여 현재 페이지의 번호를 알아보겠습니다.

// 페이지 넘버 가져오기
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

두 번째 페이지에서 $paged의 값은 2가 됩니다. 세 번째 페이지에서는 $paged // 3 이런 식으로 계속 됩니다.

페이지당 게시물 가져오기

다음으로 페이지당 게시물 수를 알아 보겠습니다.

// 페이지당 게시물수 가져오기
$posts_per_page = get_option( 'posts_per_page' );

pagination에서 번호 매김 조정

요약하자면, 이제 while 루프가 시작되기 전에 세 개의 변수가 정의되었습니다

  • 게시된 포스트의 수
  • 현재 페이지 번호
  • 페이지당 게시물

100개의 포스트가있고 페이지당 10개의 게시물을 나타내고있다고 가정해보면, 두 번째 페이지에서는 #90으로 번호가 시작되어야 합니다.

수정된 포스트 번호 = 총 포스트의 수 - ( ( 현재 페이지 넘버 - 1 ) * 페이지가 게시될 포스트의 수 )
90 = 100 - ( ( 2 - 1 ) * 10 )

finish code

// 게시된 충 포스트의 갯수
$post_count = wp_count_posts( 'custom_type' )->publish;

// 페이지 넘버 - 1
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$paged = $paged - 1;

// 페이지당 게시물수 가져오기
$posts_per_page = get_option( 'posts_per_page' );

// 조정된 포스트의 번호
$adjusted_count = $post_count - ( $paged * $posts_per_page );
https://themetry.com/post-order-number/