Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Hi to the community,
is it possible to change the default username slug to nickname if is available?

By default the url is something like: http://domain.tld/author/(admin) ,
is it possible to rewrite and change to http://domain.tld/author/(nickname) so if a user change his nickname from the profile page the slug it will change also to the new name given by the user?

thanks a lot!
Philip

share|improve this question
    
I don't think you realistically can, there's no query_var that will find posts based on a user's nickname, therefore no appropriate variable to map the nickname to in a rewrite rule. You'd have to add your own query var handling to deal with nickname queries alongside any rewrite code(it's possible in theory, but i don't think it would be elegant in practice). –  t31os Dec 22 '10 at 9:27

5 Answers 5

up vote 6 down vote accepted

I see two ways to solve this problem: changing the data that forms the author URL, or changing the author URL. You probably should handle redirects too, so old URLs to user archives keep working when a user changes their nickname.

Changing the author URL

There are two parts to this question: handle incoming links with the author nickname instead of the author slug, and generate author post urls with the nickname instead of the standard slug.

The first part is solved by hooking 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 second 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;
}

Changing the data that forms the author URL

A maybe easier way would be to update the otherwise unused user_nicename field in the database. I think it is generated from the user login and never changed after that. But I'm not an expert in user management, so use it at your own risk.

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 );
    }
}
share|improve this answer
    
Nice solution. I haven't checked it yet, but I think your approach is really good. –  Rilwis Jan 7 '11 at 15:34
    
What about duplicate author nicenames? Do we need to worry about that, or does WP take care of it? –  Drew Baker May 23 '13 at 18:38
    
As @DrewBaker said, there might be an issue with duplicated urls if two user profiles have similar names. Say if a user 1 edited his user name as John and there is another user with similar name, the both user profiles have single author url as site.com/author/john. Can you tell me if there is a fix for this? –  IamSJ Dec 28 '13 at 8:14
    
Also if there is a space in between the name, the URL will not work. It happens with the random usernames created with this code. When I tried the code on my end, it generates the random usernames like New user 654937 and the author URL looks like site.com/author/Newuser654937/. That URL will not work until we again change the profile name and remove the spaces. Is there Can you suggest a solution with it? –  IamSJ Dec 28 '13 at 8:17
    
@IamSJ: There is no automatic prevention against duplicate names, or invalid characters. You will have to provide this yourself. Probably the easiest if you do it via the second way, changing the "nicename". –  Jan Fabry Dec 29 '13 at 11:43

a easy way is the plugin Author Slug

Also you can use small code:

add_action('init', 'set_new_author_base');
function set_new_author_base() {
    global $wp_rewrite;
    $author_slug = 'new_slug';
    $wp_rewrite->author_base = $author_slug;
}
share|improve this answer
3  
It's not the author base the user is looking to change unfortunately. –  t31os Dec 22 '10 at 9:24

If you change the author slug watch out for broken links, especially in relation to SEO if your site is already live.

share|improve this answer

Jan Fabry's code snippets are good. However, you don't need the third snippet ("Changing the data that forms the author URL") if you have the Active Directory Integration plugin. You can set that plugin to override the nickname user meta value by going to the plugin's User Meta tab and entering mailnickname:string:nickname in the Additional User Attributes area. Note that you may need to replace mailnickname with whatever Active Directory user attribute works for you.

Note: The Author Slug plugin doesn't work in Multisite/Network mode.

share|improve this answer

Use this plugin: http://wordpress.org/extend/plugins/display-name-author-permalink/

Though it's not tested for 3.2.1. I've been using it without a problem.

If you receive a header error when activating the plugin, you'll find a fix here: http://wordpresscloaker.com/blog/how-to-fix-wordpress-plugin-does-not-have-a-valid-header-error.html

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.