안녕하세요. 린치핀소프트 한광희입니다.

 

이번에 소개해드리는 액션 훅(Action Hook) ” pre_get_posts”는 테마와 플러그인 개발시에 굉장히 유용하고 도움이 되는 액션 훅입니다.

이 “pre_get_posts” 액션훅은 워드프레스가 페이지를 로드하기전에 기본적인 메인 쿼리(wp_query) 가 생성된 후 그리고 해당 쿼리가 운용(run) 되기 직전에 실행되는 액션 훅입니다.

즉, 이 “pre_get_posts”액션 훅이 실행되는 시점은 URL, query string ,page name 등의 정보가 수합되어 해당 정보를 이용할수 있는 상태 이후이며, 아직 해당 정보를 반영하여 페이지를 조작하기 직전에 실행되는 액션 훅입니다. 이 시점의 액션훅을 이용하여 query에 특정 정보를 추가하거나 삭제하면 수정된 query로 페이지가 갱신됩니다.

 

조금 어려운 설명이었나요? 그러면 pre_get_posts 액션 훅을 이용하여 할 수 있는 여러가지 응용사례들을 나열해보겠습니다.

1.검색(search.php) 페이지에 있어 특정 Post_type의 제외 또는 포함.

2.블로그 아카이브 페이지에서 특정 카테고리의 포스트만 포함하여 노출하도록 조정.

3.블로그 아카이브 페이지에서 한 페이지당 보여지는 포스트의 수를 조정하거나 포스트를 제외, 페이지네이션(pagination)의 offset 등의 조정.

4.query string을 확인후 특정 동작을 수행하도록 조정

 

위와 같은 동작을 pre_get_posts 액션 훅을 이용함으로써 수월하게 조정할 수 있습니다 .특히나 자신이 직접 개발한 테마나 플러그인에서도 유용하지만 다른 개발자가 제작한 테마와 플러그인을 수정하는데 있어서도 효과적인 액션 훅입니다

 

1.  첫번재 예제 소스코드

class linchpinCPT{

  public function __construct(){

    add_action('pre_get_posts',array($this,'search_range_set'));
  }
  public function search_range_set($query){
    if(!is_admin() && $query->is_main_query())
    {
      if( $query->is_search) {
        $query->set('post_type','linchpin_CPT');
      }
    }
  }
}

이 예제는 현재 보여지는 페이지가 “검색결과 페이지”일 경우 검색을 수행할 포스트 타입(Post Type)을 “linchpin_CPT”로 한정하는 예제입니다.

$query->is_search 가 bool(true/false)값을 반환하며, 현재 검색페이지결과를 나타내는 페이지일 경우 “true”를 반환해줍니다. 여기서 지정하는 $query->set(‘post_type’,’linchpin_CPT’); 코드가 검색결과의 포스트타입을 ‘linchpin_CPT’타입으로 지정하고 있습니다.

이후에는 검색결과에 있어 페이지(page), 글(포스트,post)는 검색대상에서 제외되어 사용자 정의형 포스트 타입(Custom Post Type)인 “linchpin_CPT” 를 대상으로만 검색을 수행합니다.

 

2.두번쨰 예제 소스코드

class linchpinMemberTemplate{

  public function __construct(){
    add_action('pre_get_posts',array($this,'customURLquery'));
  }
  public function customURLquery($query){
    global $wpdb;

    if( isset($query->query['linchpin_maftk']) && $query->query['linchpin_maftk'] != '')
    {

      if($query->query['pagename'] != 'member_password_set')
    {
      wp_redirect(home_url());
      exit();
    }
  }
}


이 예제에서는 현재 보여지는 페이지의 query string과 page_name(슬러그,slug)를 확인하여 기대하는 페이지에 올바른 query string이 전송되었는지 확인하고 있는 예제입니다.

개발자가 기대하지 않은 시나리오일 경우에는 wp_redirect(home_url()); 을 기술하여 워드프레스 사이트의 메인 페이지로 리다이렉트하고 있습니다.

첫번째 소스코드와 다르게 $query->query[] 배열(Array)을 이용하여 현재 보여지고 있는 페이지의 쿼리를 확인한 후 그 다음 동작을 지정하고 있습니다.

 

pre_get_posts 액션 훅에 대한 자세한 설명은 https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts 를 참고하세요.

query 에 대한 설명은 https://codex.wordpress.org/Class_Reference/WP_Query 를 참고하세요.

 

참조

1.워드프레스 훅이란?

2.CPT(Custom Post Type)이란?