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);
Previousview query, you can see how you can inspect the current query (ok)NextSau khi nối bảng chú ý sử dụng posts_groupby, ví dụ này lấy được post_content (ok)
Last updated
Was this helpful?