How to search for posts IN OR title OR content OR author?

https://wordpress.stackexchange.com/questions/173193/how-to-search-for-posts-in-or-title-or-content-or-author

add_filter('posts_join', 'custom_posts_join');
add_filter('posts_groupby', 'custom_posts_groupby');
add_filter('posts_where', 'custom_posts_where');
function custom_posts_join($join) {
  global $wpdb;
  if (is_search() && !is_admin()) {
    $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
  }
  return $join;
}
function custom_posts_groupby($groupby) {
  global $wpdb;
  if (is_search() && !is_admin()) {
    $groupby = "$wpdb->posts.ID";
  }
  return $groupby;
}
function custom_posts_where($where = '') {
  if (is_search() && !is_admin()) {
    global $wpdb;
    $search = (isset($_GET["s"])) ? sanitize_text_field($_GET["s"]) : false;
    $search = (string) $search;
    $users  = $wpdb->get_results("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'first_name' AND meta_value = '$search'", OBJECT_K);
    foreach ($users as $user) {
      $users_ids .= $user->user_id . ',';
    }
    $users_ids = rtrim($users_ids, ',');
    $where .= " AND ( ($wpdb->posts.post_author IN ({$users_ids})) OR ($wpdb->posts.post_title LIKE '$search') OR ($wpdb->posts.post_content LIKE '$search') ) AND $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_status = 'publish'";
  }
  return $where;
}
function custom_search_posts($search, &$wp_query) {
  global $wpdb;
  if (empty($search)) {
    return $search;
  }
  // exit if search is empty

  $q         = $wp_query->query_vars;
  $n         = !empty($q['exact']) ? '' : '%';
  $search    = '';
  $searchand = '';

  add_filter('posts_join', 'custom_posts_join');
  add_filter('posts_groupby', 'custom_posts_groupby');
  foreach ((array) $q['search_terms'] as $term) {
    $user_args = array(
      'meta_query' => array(
        'relation' => 'OR',
        array(
          'key'     => 'first_name',
          'value'   => $term,
          'compare' => 'LIKE',
        ),
        array(
          'key'     => 'last_name',
          'value'   => $term,
          'compare' => 'LIKE',
        ),
      ));
    $user_query = new WP_User_Query($user_args);
    $users      = $user_query->get_results();
    $term       = esc_sql(like_escape($term));
    $search .= "{$searchand} $wpdb->posts.post_title LIKE '{$n}{$term}{$n}' ";
    if (!empty($users)) {
      foreach ($users as $user) {
        $user_id = $user->ID;
        $search .= " OR $wpdb->posts.post_author IN ('{$user_id}') ";
      }
    }
    $searchand = ' AND ';
  }
  if (!empty($search)) {
    $search = " AND ({$search}) ";
    if (!is_user_logged_in()) {
      $search .= " AND ($wpdb->posts.post_password = '') ";
    }
  }
  $search .= " AND $wpdb->posts.post_type IN ('post')";
  $search .= " AND $wpdb->posts.post_status = 'publish'";
  remove_filter('posts_join', 'custom_posts_join');
  remove_filter('posts_groupby', 'custom_posts_groupby');
  return $search;
}
add_filter('posts_search', 'custom_search_posts', 500, 2);

Last updated