How to remove author base in WordPress

Standard author links in WordPress look like: example.com/author/johnsmith

I’d like to remove the author/ part of the URL so the username is in the root. For example: example.com/johnsmith

Read More

I control page creation on my site so there will be no chance of a conflict in page and author name.

So far I’ve tried the following solution from WP Snippet but this no longer seems to work:

add_filter('author_rewrite_rules', 'no_author_base_rewrite_rules');
function no_author_base_rewrite_rules($author_rewrite) {
    global $wpdb;
    $author_rewrite = array();
    $authors = $wpdb->get_results("SELECT user_nicename AS nicename from $wpdb->users");   
    foreach($authors as $author) {
        $author_rewrite["({$author->nicename})/page/?([0-9]+)/?$"] = 'index.php?author_name=$matches[1]&paged=$matches[2]';
        $author_rewrite["({$author->nicename})/?$"] = 'index.php?author_name=$matches[1]';
    }  
    return $author_rewrite;
}


add_filter('author_link', 'no_author_base', 1000, 2);
function no_author_base($link, $author_id) {
    $link_base = trailingslashit(get_option('home'));
    $link = preg_replace("|^{$link_base}author/|", '', $link);
    return $link_base . $link;
}

Do anyone know if there is a working solution to this?

Related posts

Leave a Reply

6 comments

  1. I’ve tested this combined solution but wasn’t working before regenerating of permalinks. You can do it, as brasfolio described : simply clicking save on permalink page in dashboard.

    add_filter('author_rewrite_rules', 'no_author_base_rewrite_rules');
    function no_author_base_rewrite_rules($author_rewrite) {
       global $wpdb;
       $author_rewrite = array();
       $authors = $wpdb->get_results("SELECT user_nicename AS nicename from $wpdb->users");   
       foreach($authors as $author) {
           $author_rewrite["({$author->nicename})/page/?([0-9]+)/?$"] = 'index.php?author_name=$matches[1]&paged=$matches[2]';
           $author_rewrite["({$author->nicename})/?$"] = 'index.php?author_name=$matches[1]';
       }  
       return $author_rewrite;
    }
    
    if( !is_admin() ) {
    add_action('init', 'author_rewrite_so_22115103');
    }
    
    function author_rewrite_so_22115103() {
       global $wp_rewrite; 
       if( 'author' == $wp_rewrite->author_base ) $wp_rewrite->author_base = null;
    }
    
  2. Your code appears fine. Manually flush your permalink structure to reflect these changes.

    1)  Settings -> Permalinks -> choose default -> Save
    2)  Revert the settings to original.
    
  3. Also add this near the other similar two, in order to redirect the feeds as well:

    $author_rewrite["({$author->nicename})/page/?([0-9]+)/?$"] = 'index.php?author_name=$matches[1]&paged=$matches[2]';
    
  4. It seems we have to refresh permalinks structure, but each time someone registered a new rule.

    So try to flush it automatically with this :

    $wp_rewrite->flush_rules();
    

    In your functions.php file.

    I had the same problem but with this it seems to be ok.
    But there’s still a problem of conflict with page & post name.