Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Include posts from authors in the search results where either their display name or user login matches the query string
<?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;
}
@scofennell

This comment has been minimized.

Copy link

commented Jun 23, 2014

Thanks for your work on this!

What's the purpose of the 'search_fields' array at line 24? I couldn't find where or how that would be used in

https://core.trac.wordpress.org/browser/tags/3.9.1/src/wp-includes/user.php#L0

However I did find a lot of references to 'search_columns'. Is that what you meant? Either way, if that did work, wouldn't that be redundant when you have your db_filter_user_query() running?

@edriessen

This comment has been minimized.

Copy link

commented May 11, 2015

Awesome, works like charm!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.