[WordPress] pre_get_posts 에 대해 알아보자

워드프레스에서 글 목록을 불러 올 때는 아래와 같은 순서로 진행됩니다. 사용자가 지정한 조건에 만족하는 쿼리가 생성되고, 해당 쿼리가 실행 되면서 글 목록이 로드 됩니다.

사용자 조건에 만족하는 쿼리

여기서 사용자 조건에 만족하는 쿼리에는 아래와 같은 것들이 포함 될 수 있습니다.

  • 전체 글 목록 조회
  • ID 가 64와 72인 카테고리의 글 목록 조회
  • type 이 post 인 글 목록 조회
  • 글 목록에서 ID 가 216인 제외

보통의 경우 이런 조건들이 이미 쿼리가 생성 될 때 모두 반영 되지만, 쿼리가 이미 생성된 상태에서 해당 조건을 바꾸려면 어떻게 해야 할까요.

쿼리 생성 -> pre_get_posts -> 쿼리 실행

쿼리가 생성되고 나서 실제 실행 되어 글 목록을 불러 오기 직전에 pre_get_posts 액션이 발동 됩니다. 따라서 pre_get_posts실제 쿼리 생성 당시에는 영향을 미치지 않으며, 생성된 쿼리의 일부 조건을 수정하여 불러올 글 목록을 바꿀 수 있는 것입니다.

실전 예제

pre_get_postsadd_action 을 이용한 실전 예제는 아래와 같습니다.

특정 카테고리의 글 목록 조회

function index_new( $query ) {
    $query->set( 'cat', '64, 72' );
}
add_action( 'pre_get_posts', 'index_new' );

$query 에서 cat 를 64 와 72 로 고정함으로써 카테고리 ID 가 64 와 72 에 포함되는 글 목록만 조회 하는 작업입니다.

글 목록에서 포스트만 조회하기

function index_new( $query ) {
    $query->set( 'post_type', 'post' );
}
add_action( 'pre_get_posts', 'index_new' );

경우에 따라 글 목록에 포스트와 페이지가 같이 나올 수 있는데, post_typepost 로 고정함으로써 페이지는 목록에서 제외시키는 방법입니다.

특정 글을 목록에서 제외하기

function index_new( $query ) {
    $query->set( 'post__not_in', 'array(216)' );
}
add_action( 'pre_get_posts', 'index_new' );

쿼리에서 post__not_in 의 값으로 216을 넣음으로써, 글 목록에 ID가 216 인 포스트는 제외시키는 방법입니다.


이렇듯 다양한 방법 조건을 기존에 생성된(하지만 아직 실행 되지 않은) 쿼리에 적용함으로써, 사용자가 원하는 글 목록을 가져올 수 있도록 하는 것이 바로 pre_get_posts 액션입니다.

참고자료