Skip to content

Instantly share code, notes, and snippets.

@chwnam
Created July 7, 2015 06:18
Show Gist options
  • Save chwnam/db62ab1b20aab8dd85af to your computer and use it in GitHub Desktop.
Save chwnam/db62ab1b20aab8dd85af to your computer and use it in GitHub Desktop.
커스텀 포스트 검색: 커스텀 필드도 포함되도록 조정
<?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;
} );
}
@chwnam
Copy link
Author

chwnam commented Nov 22, 2015

포스팅은 이 곳에서 보실 수 있습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment