Last active
September 5, 2024 01:44
-
-
Save danielbachhuber/7126249 to your computer and use it in GitHub Desktop.
Include posts from authors in the search results where either their display name or user login matches the query string
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Include posts from authors in the search results where | |
* either their display name or user login matches the query string | |
* | |
* @author danielbachhuber | |
*/ | |
add_filter( 'posts_search', 'db_filter_authors_search' ); | |
function db_filter_authors_search( $posts_search ) { | |
// Don't modify the query at all if we're not on the search template | |
// or if the LIKE is empty | |
if ( !is_search() || empty( $posts_search ) ) | |
return $posts_search; | |
global $wpdb; | |
// Get all of the users of the blog and see if the search query matches either | |
// the display name or the user login | |
add_filter( 'pre_user_query', 'db_filter_user_query' ); | |
$search = sanitize_text_field( get_query_var( 's' ) ); | |
$args = array( | |
'count_total' => false, | |
'search' => sprintf( '*%s*', $search ), | |
'search_fields' => array( | |
'display_name', | |
'user_login', | |
), | |
'fields' => 'ID', | |
); | |
$matching_users = get_users( $args ); | |
remove_filter( 'pre_user_query', 'db_filter_user_query' ); | |
// Don't modify the query if there aren't any matching users | |
if ( empty( $matching_users ) ) | |
return $posts_search; | |
// Take a slightly different approach than core where we want all of the posts from these authors | |
$posts_search = str_replace( ')))', ")) OR ( {$wpdb->posts}.post_author IN (" . implode( ',', array_map( 'absint', $matching_users ) ) . ")))", $posts_search ); | |
return $posts_search; | |
} | |
/** | |
* Modify get_users() to search display_name instead of user_nicename | |
*/ | |
function db_filter_user_query( &$user_query ) { | |
if ( is_object( $user_query ) ) | |
$user_query->query_where = str_replace( "user_nicename LIKE", "display_name LIKE", $user_query->query_where ); | |
return $user_query; | |
} |
Hey! Thanks a lot, it's been very useful!
it's including pages and posts from custom post type too. How can I show only post, not page or custom post type?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Awesome, works like charm!