I have the followign code in my functions.php file

function __adapted_search_function($search, $query) {
  if(is_admin() || !$query->is_main_query() || !$query->is_search)
    return; //determine if we are modifying the right query

  global $wpdb;
  $search_term = $query->get('s');
  $search=" AND (";

  //point 1
  $search .= "($wpdb->posts.post_title LIKE '%$search_term%')";

  //need to add an OR between search conditions
  $search .= " OR ";

  //point 2
  $search .= "($wpdb->posts.post_excerpt LIKE '%$search_term%')";

  //need to add an OR between search conditions
  $search .= " OR ";

  //point 3
  $search .= "($wpdb->postmeta.meta_key = 'mcb-product' AND $wpdb->postmeta.meta_value LIKE '%$search_term%')";

  //add the filter to join, sql will error out without joining the tables to the query
  add_filter('posts_join', '__custom_join_tables');   


  return $search . ') ';
}

function __custom_join_tables($joins) {
  global $wpdb;
  $joins = "JOIN $wpdb->postmeta ON ($wpdb->postmeta.post_ID = $wpdb->posts.ID)";
  return $joins;
}

Which I was hoping would search only the post title, excerpt and also a single custom field.

It works if I remove the join but really need to keep that included, can anyone see where I have gone wrong?

2 Answers
2

I managed to resolve by extending the query

function extend_search( $search, &$wp_query ) {
    global $wpdb;

    if ( empty( $search ))
        return $search;

    $terms = $wp_query->query_vars[ 's' ];
    $exploded = explode( ' ', $terms );
    if( $exploded === FALSE || count( $exploded ) == 0 )
        $exploded = array( 0 => $terms );

    $search="";
    foreach( $exploded as $tag ) {
        $search .= " AND (
            ($wpdb->posts.post_title LIKE '%$tag%')
            OR ($wpdb->posts.post_excerpt LIKE '%$tag%')
            OR EXISTS
            (
                SELECT * FROM $wpdb->postmeta
                WHERE post_ID = pl_posts.ID
                    AND meta_key = '--KEY--'
                    AND meta_value LIKE '%$tag%'
            )

        )";
    }

    return $search;
}

Leave a Reply

Your email address will not be published. Required fields are marked *