修改WordPress作者存档链接

wordpress的里的所有注册用户都有一个专属的链接,称之为作者存档页链接,通常是这样的:

// 未url重写
http://你的域名/?author=1 
// 已url重写
http://你的域名/author/admin

其中未url重写的参数值是用户id,而url重写后的参数值是用户名。通常,我们都使用了url重写,访问“http://你的域名/?author=1”,直接暴露了用户名,这可能对wordpress存在安全隐患。所以需要修改存档链接。

方法一:将作者存档链接中的用户名改为昵称

将下面的代码添加到当前主题的 functions.php 中:

/**
 * 将WordPress作者存档链接中的用户名改为昵称
 * https://www.wpdaxue.com/use-nickname-for-author-slug.html
 */
//使用昵称替换用户名,通过用户ID进行查询
add_filter( 'request', 'wpdaxue_request' );
function wpdaxue_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;
}
 
//使用昵称替换链接中的用户名
add_filter( 'author_link', 'wpdaxue_author_link', 10, 3 );
function wpdaxue_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;
}

接着我们在个人资料中修改昵称为其他名称,如下图,用户 admin的昵称改为了netnote,这样一来,作者存档的链接就自动由 http://域名/author/admin 变成了 http://域名/author/netnote。

此外,记得将“公开显示为”设置为非用户名,这样就OK啦!

访问作者存档页显示如下:

注意:昵称不要包含空格,同时不建议使用中文,作者归档页会出现404,如果是多用户博客,可能会存在昵称相同的情况,这时候只会显示ID较早的用户。

方法二:将作者存档链接中的用户名改为用户ID

将下面的代码添加到当前主题的 functions.php 中:

/**
 * 修改url重写后的作者存档页的链接变量
 * @since yundanran-3 beta 2
 * 2013年10月8日23:23:49
 */
add_filter( 'author_link', 'yundanran_author_link', 10, 2 );
function yundanran_author_link( $link, $author_id) {
 global $wp_rewrite;
 $author_id = (int) $author_id;
 $link = $wp_rewrite->get_author_permastruct();
 
 if ( empty($link) ) {
 $file = home_url( '/' );
 $link = $file . '?author=' . $author_id;
 } else {
 $link = str_replace('%author%', $author_id, $link);
 $link = home_url( user_trailingslashit( $link ) );
 }
 
 return $link;
}


/**
 * 为了避免出现404,我们需要修改作者存档页的url重写规则。
 * 作者存档页链接有2个查询变量,
 * 一个是author(作者用户id),用于未url重写
 * 另一个是author_name(作者用户名),用于url重写
 * 此处做的是,在url重写之后,把author_name替换为author
 * @version 1.0
 * @since yundanran-3 beta 2
 * 2013年10月8日23:19:13
 * @link https://www.wpdaxue.com/use-nickname-for-author-slug.html
 */
add_filter( 'request', 'yundanran_author_link_request' );
function yundanran_author_link_request( $query_vars ) {
 if ( array_key_exists( 'author_name', $query_vars ) ) {
 global $wpdb;
 $author_id=$query_vars['author_name'];
 if ( $author_id ) {
 $query_vars['author'] = $author_id;
 unset( $query_vars['author_name'] ); 
 }
 }
 return $query_vars;
}

修改之后,在前台输出作者存档页的链接:

get_author_posts_url(1);
// =>http://你的域名/author/1

访问“http://你的域名/?author=1”跳转到“http://你的域名/author/1”。