FutureMedia
2/20/2015 - 3:52 PM

An extended Search for WP

An extended Search for WP

<?php
//Custom search in both post title/content and custom fields, may be narrowed to a certain post type and/or category/tax (sent as URL parameters)
//Include <input type="hidden" name="post_type" value="[post-type]"> in search form code to send URL parameters
//May be used in custom search template (for example, search-[posttype].php)
//Original code from http://www.deluxeblogtips.com/2012/04/search-all-custom-fields.html
global $wpdb;
// If you use a custom search form
// $kw_unesc = sanitize_text_field( $_GET['s_registry'] );
$taxname = 'regcat';
$kw_unesc = get_search_query();
$posttype = sanitize_text_field( $_GET['post_type'] );
$term = sanitize_text_field( $_GET['term'] );
$termTitle = get_term_by('slug',$term,$taxname);
if (!preg_match('/\s/',$kw_unesc)) {
	$keyword = '%' . like_escape( $kw_unesc ) . '%';
	$post_ids_meta = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT post_id FROM {$wpdb->postmeta} WHERE meta_value LIKE '%s'", $keyword ) );
	$post_ids_post = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT ID FROM {$wpdb->posts} WHERE post_title LIKE '%s' OR post_content LIKE '%s'", $keyword, $keyword ) );
} else {
	$keywords = array();
	$post_ids_meta = array();
	$post_ids_post = array();
	$keywords_unescaped = explode(" ", $kw_unesc);
	$mysqlquery_postmeta = "SELECT DISTINCT post_id FROM {$wpdb->postmeta} WHERE meta_value LIKE '%s'";
	$mysqlquery_postcontent =  "SELECT DISTINCT ID FROM {$wpdb->posts} WHERE post_title LIKE '%s' OR post_content LIKE '%s'";
	foreach ($keywords_unescaped as $kw_unesc) {
		$keywords[] = '%' . like_escape( $kw_unesc ) . '%'; 
	}
	$post_ids_meta = $wpdb->get_col( $wpdb->prepare( $mysqlquery_postmeta, $keywords ) );
	$post_ids_post = $wpdb->get_col( $wpdb->prepare( $mysqlquery_postcontent, $keywords, $keywords ) );
}
$post_ids = array_merge( $post_ids_meta, $post_ids_post );
$args = array(
	'post_type' => $posttype
	,'post__in' => $post_ids
	,'paged' => max( get_query_var( 'paged' ), 1 ) 
);
if ($term) {
	$args[$taxname] = $term;
}
$query = new WP_Query( $args );
?>
<?php $posttype = 'registry';
	$posttype_obj = get_post_type_object($posttype);
	$search_posttype_label = $posttype_obj->labels->search_items;
	$term = $wp_query->queried_object;
	// $term_based_on_posttype = get_object_taxonomies($posttype);
	?>
	<!-- change all ids in form to prevent conflict with default site search form -->
	<form role="search" method="get" id="searchform_<?php echo $posttype; ?>" class="searchform" action="search-<?php echo $posttype; ?>.php">
		<div>
			<label class="screen-reader-text" for="s_<?php echo $posttype; ?>"><?php echo $search_posttype_label; ?></label>
			<input type="text" value="" name="s" id="s_<?php echo $posttype; ?>">
			<input type="hidden" name="post_type" value="<?php echo $posttype; ?>">
			<!-- if on taxonomy page --><input type="hidden" name="term" value="<?php echo $term->slug; ?>">
			<input type="submit" id="searchsubmit_<?php echo $posttype; ?>" value="OK">
		</div>
	</form>