Add custom field (value) to search result (without plugin)

I need to add custom field to wordpress search result.

This what i tried to do is used pre_get_posts filter, like this:

function search_filter( $query ) {

    $key_fields = array ( 'buty' );
    $value_field = $query->query_vars['s'];
    $query->query_vars['s'] = '';

    if ( $value_field != '' ) {

        $filter_query = array( 'relation' => 'OR' );

        foreach ( $key_fields as $one_field ) {
            array_push ( $filter_query , array (
                'key' => $one_field,
                'value' => $value_field,
                'compare' => 'LIKE'
            ) );
        }
        $query->set( 'meta_query' , $filter_query );

    }

}
add_filter( 'pre_get_posts' , 'search_filter');

It works, but now search not working for post title and post content

So the question is: how to properly add custom field to WordPress search result without lose standard functionality?

1 Answer
1

WordPress search in posts table. You must change the search query by adding a postmeta table (with LEFT JOIN) and then add your own conditions to WHERE clause.

<?php
/**
 * Extend WordPress search to include custom fields
 *
 * https://adambalee.com
 */

/**
 * Join posts and postmeta tables
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
 */
function cf_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', 'cf_search_join' );

/**
 * Modify the search query with posts_where
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
 */
function cf_search_where( $where ) {
    global $pagenow, $wpdb;

    $key_fields = array ( 'buty' );
    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 AND "
                 .$wpdb->postmeta. ".meta_key IN ('" .implode("','", $key_fields). "') )", $where );
    }

    return $where;
}
add_filter( 'posts_where', 'cf_search_where' );

/**
 * Prevent duplicates
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
 */
function cf_search_distinct( $where ) {
    global $wpdb;

    if ( is_search() ) {
        return "DISTINCT";
    }

    return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );

Details can be found here “Search WordPress by Custom Fields without a Plugin”

Leave a Comment