Created
July 7, 2015 06:18
-
-
Save chwnam/db62ab1b20aab8dd85af to your computer and use it in GitHub Desktop.
커스텀 포스트 검색: 커스텀 필드도 포함되도록 조정
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Plugin Name: Custom Field Search | |
Author: changwoo | |
*/ | |
add_action( 'init', 'my_test_register_post_type' ); | |
function my_test_register_post_type() { | |
register_post_type( 'my-test-post', array( | |
'label' => 'My Test Posts', | |
'public' => TRUE, | |
) ); | |
} | |
register_activation_hook( __FILE__, 'my_test_on_activated' ); | |
function my_test_on_activated() { | |
my_test_register_post_type(); | |
$post_one = wp_insert_post( array( | |
'post_content' => '테스트 포스트 01입니다.', | |
'post_name' => 'my_test_post_01', | |
'post_title' => '테스트 포스트 01', | |
'post_status' => 'publish', | |
'post_type' => 'my-test-post', | |
) ); | |
update_post_meta( $post_one, 'my_test_value_1', '메타1 하나 둘 셋' ); | |
update_post_meta( $post_one, 'my_test_value_2', '메타2 넷 다섯 여섯' ); | |
$post_two = wp_insert_post( array( | |
'post_content' => '테스트 포스트 02입니다.', | |
'post_name' => 'my_test_post_02', | |
'post_title' => '테스트 포스트 02', | |
'post_status' => 'publish', | |
'post_type' => 'my-test-post', | |
) ); | |
update_post_meta( $post_two, 'my_test_value_1', '메타1 01 02 03' ); | |
update_post_meta( $post_two, 'my_test_value_2', '메타2 04 05 06' ); | |
} | |
register_deactivation_hook( __FILE__, 'my_test_on_deactivated' ); | |
function my_test_on_deactivated() { | |
my_test_register_post_type(); | |
$query = new WP_Query( array( | |
'post_type' => 'my-test-post', | |
'nopaging' => TRUE, | |
'fields' => 'ids', | |
) ); | |
$posts = &$query->get_posts(); | |
foreach( $posts as $post ) { | |
delete_post_meta( $post, 'my_test_value_1' ); | |
delete_post_meta( $post, 'my_test_value_2' ); | |
wp_delete_post( $post ); | |
} | |
} | |
$my_test_search_query = ''; | |
$my_test_meta_query = ''; | |
add_action( 'pre_get_posts', 'my_test_get_posts' ); | |
function my_test_get_posts( $query ) { | |
global $pagenow; | |
global $post_type; | |
$term = $query->get( 's' ); | |
if( !is_admin() || $post_type != 'my-test-post' || $pagenow != 'edit.php' || empty( $term ) ) { | |
return; | |
} | |
$meta_query = $query->get( 'meta_query' ); | |
$search = array( | |
'relation' => 'OR', | |
array( | |
'key' => 'my_test_value_1', | |
'value' => $term, | |
'compare' => 'LIKE' | |
), | |
array( | |
'key' => 'my_test_value_2', | |
'value' => $term, | |
'compare' => 'LIKE' | |
) | |
); | |
$meta_query[] = $search; | |
$query->set( 'meta_query', $meta_query ); | |
// add_filter( 'get_meta_sql', function( $sql ) { | |
// $sql['where'] = preg_replace( '/\s*AND\s+(.+)/ms', ' OR $1', $sql['where'] ); | |
// return $sql; | |
// }); | |
// | |
// return; | |
// post_title, post_content 검색 쿼리 부분 기록 | |
add_filter( 'posts_search', function ( $sql ) { | |
global $my_test_search_query; | |
$my_test_search_query = $sql; | |
return $sql; | |
} ); | |
// meta 부분 쿼리 기록 (join, where 키로 구성된 array) | |
add_filter( 'get_meta_sql', function ( $sql ) { | |
global $my_test_meta_query; | |
$my_test_meta_query = $sql; | |
return $sql; | |
} ); | |
// where 절을 최종 편집 | |
add_filter( 'posts_where', function ( $sql ) { | |
global $my_test_search_query, $my_test_meta_query; | |
$m = NULL; | |
// search_query 문자열은 보통 괄호 두 개 안에 post_title, post_content 각 필드 조건을 OR로 묶음. | |
if( preg_match('/\(\((.+)\)\)/ms', $my_test_search_query, $m ) ) { | |
$meta_part = $my_test_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( $my_test_search_query, $substitute, $sql ); | |
} | |
return $sql; | |
} ); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
포스팅은 이 곳에서 보실 수 있습니다.