If your blog has multiple authors, it is quite likely that your are going to want to give your users the ability to view posts by author. The default author slug or URL contains the author’s username, which can be bad for security. Usernames should be private otherwise it gives hackers information that can be useful to hack into the site.
By default the url is something like: http://domain.tld/author/(admin)
But really, the best way is to have it like this: http://domain.tld/author/(nickname)
The below code hooks into the request filter, checking whether it is an author request, and looking up the author by nickname instead of slug. If we find an author, we change the query parameters to use the author ID.:
add_filter( 'request', 'wpse5742_request' ); function wpse5742_request( $query_vars ) { if ( array_key_exists( 'author_name', $query_vars ) ) { global $wpdb; $author_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key='nickname' AND meta_value = %s", $query_vars['author_name'] ) ); if ( $author_id ) { $query_vars['author'] = $author_id; unset( $query_vars['author_name'] ); } } return $query_vars; }
The next part is done by hooking into the author_link filter and replacing the standard author part (indicated by $author_nicename) with the nickname.
add_filter( 'author_link', 'wpse5742_author_link', 10, 3 ); function wpse5742_author_link( $link, $author_id, $author_nicename ) { $author_nickname = get_user_meta( $author_id, 'nickname', true ); if ( $author_nickname ) { $link = str_replace( $author_nicename, $author_nickname, $link ); } return $link; }
Finally we change the data that forms the author URL:
add_action( 'user_profile_update_errors', 'wpse5742_set_user_nicename_to_nickname', 10, 3 ); function wpse5742_set_user_nicename_to_nickname( &$errors, $update, &$user ) { if ( ! empty( $user->nickname ) ) { $user->user_nicename = sanitize_title( $user->nickname, $user->display_name ); } }
(Note that all of the above code goes into your theme’s functions.php file)