开发者

Remove author prefix on WordPress [closed]

Closed. This question is off-topic. It is not currently accepting answers.

Want to improve this question? Update the question so it's on-topic for Stack Overflow.

开发者_JAVA技巧

Closed 9 years ago.

Improve this question

How can I remove the author prefix on a WordPress website, I have done a quick Google but have only found htaccess redirects which I don't want to resort to.

To clarify I want to turn this:

http://www.domain.com/author/cameron/

into this

http://www.domain.com/cameron/

I don't want to use any redirects of any kind, but actual PHP code I can use in the functions.php file, as I want all links across the site that use the author stuff to auto update without keeping there original links and then redirecting to the new one.

Thanks


You basically need to add WP rewrite rules to match the names of each of your users in the desired form. This is what the WP No Category Base does for categories, so most of the code in my answer is adapted from that plugin.

The primary part of the plugin is a function which hooks into the author_rewrite_rules filter and replaces the author rewrite rules. This retrieves all the user names and adds a rewrite rule specifically for each user (the below won't handle feeds, so look at the WP No Category Base source if you need that).

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;
}

The other key part of the plugin is a function which hooks into the author_link filter and removes the 'author' base from the returned URL.

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;
}

See this gist: http://gist.github.com/564465

This doesn't handle redirection from the old style author URLs, again, see the WP No Category Base source if you need to do that.


Be sure to replace this piece of code inside no_author_base_rewrite_rules() :

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]';

  $rules = get_option( 'rewrite_rules' );
  if ( ! isset( $rules['({$author->nicename})/?$'] ) ) {
    global $wp_rewrite;
      $wp_rewrite->flush_rules();
  }
}

So that Wordpress refreshes the rewrite list. (otherwise some links may not work).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜