커스텀 필드는 글이나 페이지 작성 시 해당 내용에 추가 정보를 원하는 대로 등록하고, 필요시에 표시할 수 있도록 해주는 아주 유용한 워드프레스의 기본 기능입니다. 또한, 이 기능을 더 유용하게 사용할 수 있도록 도와주는 플러그인이 ACF(Advanced Custom Fields)입니다.
커스텀 필드 내용 검색 문제
ACF를 쓰든 아니면 워드프레스의 커스텀필드 기본기능을 이용하던 포스트나 페이지 작성 시 추가 데이터를 넣으면 이 데이터는 워드프레스 기본 검색기에 검색되지 않습니다. 커스텀필드의 데이터는 내용 저장 시 데이터베이스의 postmeta 테이블에 저장되는데 워드프레스 기본 검색기는 검색요청 시 posts 테이블의 내용만 검색해서 결과를 보여주기 때문입니다.
워드프레스 기본 검색에 포함되도록 하려면
아래의 코드를 사용중인 차일드테마의 functions.php 파일 맨 아래에 붙여 넣기 합니다.
/* 커스텀 필드의 내용을 기본 검색에 포함 */
//1.posts 와 postmeta 테이블 Join
function wpbox_search_join( $join ) {
global $wpdb;
if ( is_search() ) {
$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
}
return $join;
}
add_filter('posts_join', 'wpbox_search_join' );
//2.쿼리 수정
function wpbox_search_where( $where ) {
global $pagenow, $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
}
return $where;
}
add_filter( 'posts_where', 'wpbox_search_where' );
//3.중복 결과 방지
function wpbox_search_distinct( $where ) {
global $wpdb;
if ( is_search() ) {
return "DISTINCT";
}
return $where;
}
add_filter( 'posts_distinct', 'wpbox_search_distinct' );