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

“posts_request” 필터 훅은 페이지 로드시에 수행되는 SQL을 제어할 수 있는 액션 훅입니다. 이 훅을 이용하면 페이지,포스트,CPT(Custom Post Type)의 검색 페이지를 제어하고 추가/수정 해 줄 수 있습니다. 즉 다음 스크린샷처럼 글(포스트)에 있어서 검색결과가 다양한 항목으로 검색되어야 할때 유용한 필터 훅이 “posts_request”입니다.

screenshot-2016-03-30

 

add_filter('posts_request','postSearchCustom');

function postSearchCustom($sql){

  global $wp_query;
  global $wpdb;

  $query = $wp_query->query_vars;
  if(!is_admin())
  {
    return $sql;
  }
  $screenNow = get_current_screen();
  if( is_admin() && isset($query['s']) && mb_strlen($query['s']) > 0 && $query['post_type'] == 'linchpin_page' && $screenNow->id == 'edit-linchpin_paper')
  {
    $s = $query['s'];
    $limit = $query['posts_per_page'];
    $offset = $query['paged'];
 
    /*

      주어진 변수를 이용하여 새로운 SQL문을 지정합니다.

    */

    return $sql;
  }
  else
  {
    return $sql;
  }
}

 

위 소스코드는 아주 간단한 posts_request 필터훅의 예시입니다.

add_filter(‘posts_request’,’postSearchCustom’) : 필터 훅을 통해 posts_request 필터 훅시에 postSearchCustom 함수를 호출합니다.
function postSearchCustom($sql) : 호출되는 함수 postSearchCustom 함수를 정의하며 매개변수로 기존의 훅에서 전달되는 SQL을 함수 매개변수로 전달받습니다.

필터훅이기에 전달받은 $sql 매개변수를 꼭 반환(return)해 주어야 합니다.

 

이후에는 반환된 $sql 문을 이용해 페이지가 구성되므로 현재 페이지가 의도한 페이지이며, 검색페이지인지등을 체크한 후 $sql을 수정하여 return하여 주는것이 검색 페이지에 있어 검색범위(항목들)를 수정하는 방법의 핵심입니다.

이때 현재 페이지등을 구분하는데 사용 할 수 있는 함수와 클래스는 다음과 같습니다.

$wp_query->query_var : 현재 페이지의 URL query string을 파싱할 수 있습니다. 검색여부 페이지,한 페이지당 포스트 수 등을 이 $wpdb_query->query_var 프로퍼티를 이용해 확인할 수 있습니다.

get_current_screen() : admin 페이지(관리자 페이지) 인 경우, 각 관리자 페이지를 식별할 수 있습니다. 이 함수는 관리자 페이지에서만 허용되는 함수입니다. 그러므로 is_admin() 의 함수를 이용하여 현재 보여지는 페이지가 관리자 페이지임을 확인한 후 함수를 호출하도록 해야합니다. 그렇지 않고 이용자 페이지에서 함수가 호출될 경우 식별되지 않는 함수를 호출하므로 오류가 발생됩니다!

 

위 2가지 내용을 확인한 후 $SQL 문을 수정한 후 return 하여 주면 됩니다.