Home 게시판 커뮤니티 Q&A 검색시 custom_post_type의 제목과, 내용에서도 같이 검색되게하려면..

5개 답변, 2 voices Last updated by Avatar of nugabanugaba 9 years, 7 months 전
  • Avatar of nugabanugaba
    Participant
    @nugaba
    #29457

    안녕하세요

    검색할때 모든 포스트의 제목과 내용에서 검색을 하잖아요

    거기에 제가 따로 추가한 post_type의 제목과 내용도 검색범위에 포함시키고자 하는데

    인터넷을 검색하면서 해봐도 에러가나옵니다.

     

    ————

    인터넷 검색으로 테마의 function.php에 다음 코드를 추가하였으나

    검색시 410gone 오류가 발생하는데 왜그런걸까요

    —–코드—–

    add_action( ‘pre_get_posts’, ‘search_add_custom_post_type’ );
    function search_add_custom_post_type( $query ) {
    global $pagenow;
    global $post_type;

    $term = $query->get( ‘s’ ); //사용자가 입력한 검색어

    //이야기거리로 검색시 ‘임의타입’이 custom post type이므로 이를 검색영역에 추가하기 위함
    if( !is_admin() || $post_type != ‘customtypename’ || $pagenow != ‘edit.php’ || empty( $term ) ) {
    return;
    }

    $meta_query = $query->get( ‘meta_query’ );

    $search = array(
    ‘relation’ => ‘OR’,
    array(
    ‘key’ => ‘post_title’,
    ‘value’ => $term,
    ‘compare’ => ‘LIKE’
    ),
    array(
    ‘key’ => ‘post_content’,
    ‘value’ => $term,
    ‘compare’ => ‘LIKE’
    )
    );

    $meta_query[] = $search;
    $query->set( ‘meta_query’, $meta_query );
    }

    //필터
    $custom_search_query = ”;
    $custom_meta_query = ”;

    // post_title, post_content 검색 쿼리 부분 기록
    add_filter( ‘posts_search’, function ( $sql ) {
    global $custom_search_query;
    $custom_search_query = $sql;
    return $sql;
    } );

    // meta 부분 쿼리 기록 (join, where 키로 구성된 array)
    add_filter( ‘get_meta_sql’, function ( $sql ) {
    global $custom_meta_query;
    $custom_meta_query = $sql;
    return $sql;
    } );

    // where 절을 최종 편집
    add_filter( ‘posts_where’, function ( $sql ) {
    global $custom_search_query, $custom_meta_query;

    $m = NULL;
    // search_query 문자열은 보통 괄호 두 개 안에 post_title, post_content 각 필드 조건을 OR로 묶음.
    if( preg_match(‘/\(\((.+)\)\)/ms’, $custom_search_query, $m ) ) {

    $meta_part = $custom_meta_query[‘where’];

    // WHERE 절에서 AND … 로 시작하는 meta 검색을 삭제
    $sql = str_replace( $meta_part, ”, $sql );

    $post_part = $m[1];
    $meta_altered = preg_replace( ‘/\s*AND\s+(.+)/ms’, ‘ OR $1’, $meta_part );
    $substitute = ‘AND ((‘ . $post_part . $meta_altered . ‘))’;

    // post title, post content 검색과 같이 커스텀 필드도 OR 조건으로 검색
    $sql = str_replace( $custom_search_query, $substitute, $sql );
    }

    return $sql;
    } );

    Avatar of Matthew ParkMatthew Park
    Moderator
    @hackya
    #29459

    일단 워드프레스 자체 검색 기능이 그리 썩 좋지 않습니다. 제가 뭘 원하는지 제 마음속 까지 읽는 수준으로 정보를 찾아주는 구글신에 익숙해서인지 아무리 좋다는 검색플러그인을 가져다 써봐도 개인적으로 만족스럽지가 않았습니다.

    그래서 저는 그냥 구글검색엔진을 제 사이트에서 씁니다. (건망증이 심해서인지 제가 써놓고도 나중에 기억을 못해서 그 내용을 찾는 경우가 많아서.. >.<)

    custom post type 은 워드프레스 자체 검색 내용에 포함되지 않고, 그래서 custom post type 도 검색결과에 포함시키시려고 하시고 계신데,

    우커머스 (워드프레스 소유/ 워드프레스 회사 중 하나 입니다.) 에서 근무하는 개발자 Remi Corson 이 공유한 script 를 한번 사용해 보시는 것은 어떨까 싶습니다.

    Include all your WordPress custom post types in search

    위에 기재해놓으신 script 는, 저한테는 매우 생소한.. 흔하게 접하는 워드프레스 식의 scripting 은 아니네요. 검색기능에 왜 filter 적용을 하는지 그 이유도 모르겠고, 누가 알려준다고 해도 알고 싶지도 않은…. -..-;;;

    직접 sql query 를 하는 건 알겠는데, 저런다고 검색결과가 좋아지기는 커녕 더 후져 나빠질것 같은데 말이죠..

    Avatar of Matthew Park
    Attorney, front-end developer, digital media artist, WordPress enthusiast, & a father of 4 wonderful children.

    Lives in Colorado.

    Avatar of nugabanugaba
    Participant
    @nugaba
    #29465

    Matthew Park님 답변 감사합니다.

    그 첨부해 주신 부분의 function을 단순히 theme의 function.php에 넣기만 하면 되는건지요?

     

    보니까 따로 건드려야 될 부분은 없는거 같은데

     

    만약에 제가 검색시
    select option이
    전체검색
    부분검색1
    부분검색2

     

    이렇게 3개가 있을 때 부분검색1 부분에서는
    전체 포스트 중 특정 카테고리와 특정 커스텀 포스트 타입에서 검색하려고 하는데요

    우선 특정 카테고리를 거르는 부분은

    <select name=”cat”>…<option value=”<?echo $cat_id;?>”>부분검색1</option>…

    $cat_id에 배열로 카테고리 아이디를 줘서 해결하긴 했는데

    여기서 위 function을 function.php에 추가하기만 하면 되는건지요.

    그리고 위 function 발동 조건을 select가 부분검색1일 경우에만 한정지으려면

    function 처음부분 if( is_search() ) { 여기에 추가로 조건을 주면 될까요??

    Avatar of nugabanugaba
    Participant
    @nugaba
    #29466

    글수정이 안되서 현재 원하는 검색 기능을 요약하자면

    부분검색1 에서 검색어를 입력하고 검색 버튼을 누르면

     

    특정 카테고리들에 추가로 custom post_type을 검색 범위로 해서

     

    검색을 하고자 합니다.

    특정 카테고리들은 name=”cat”, value에 카테고리id를 배열로 줘서 해결했으나

    여기에 일반 post가 아닌 custom post_type의 title과 content에서도 검색이 되게끔 하고자 합니다.

     

    물론 select박스가 전체검색일때는 모든 post에서 검색이 되게 하고요.

    Avatar of Matthew ParkMatthew Park
    Moderator
    @hackya
    #29472

    처음 질문과는 또 전혀 다른 질문이시네요. ㅎㅎㅎ 아니면 제가 난독증인건지…

    여기저기서 짜집기 해서 원하시는 기능을 구축하는 것도 방법이기한데, 검증되고 잘 작동되는 오픈소스를 사용하시는 것 도 좋은 방법입니다.

    영어로 지금 원하시는 검색기능을 설명하자면, 이렇게 들립니다.

    Need a multi-select author field combined with a keyword search plus checkboxes for multiple taxonomies?

    설명하신 내용에 거의 직역에 가깝지 않나 생각되는데….

    이걸 원하신다는거죠?

    http://wpadvancedsearch.com/

    소스코드는 github 에 공유되어 있습니다.

    https://github.com/bootsz/wp-advanced-search

    Avatar of Matthew Park
    Attorney, front-end developer, digital media artist, WordPress enthusiast, & a father of 4 wonderful children.

    Lives in Colorado.

    Avatar of nugabanugaba
    Participant
    @nugaba
    #29477

    아 연휴끝나고 이제야 봤습니다.

    음 제가 영어 실력이 부족해서..

    대충 원하는 기능을 영어로 하자면

    how to search titles, contents for custom and normal post type

    이건데요

    그… 위 기능 중 custom post_type을 ‘함께’ 검색한다는 부분을 모르겠습니다.(일반 post에서는 category로 post를 한정지어서 검색할 건데 그부분은 name을 cat로 주고 id를 categoryid로 줘서 해결 했습니다)

    그래도 직역까지 해주시고 감사합니다.

    나머지는 제가 찾아야 할 몫이겠죠 ㅎ

6 글 보임 - 1에서 6 까지 (총 6 중에서)
  • 답변은 로그인 후 가능합니다.