将 WordPress 作者存档链接中的用户名改为昵称或 ID(修复中文昵称 404)

2017-05-27 16:27 1,681 25 条评论 龙笑天下
导语: 本文简要的介绍“隐藏管理员用户名”的一个方法,就是将作者存档链接中的用户名改为昵称或 ID~
Dragon主题购买

将 WordPress 作者存档链接中的用户名改为昵称或 ID(修复中文昵称 404)

什么是作者存档页链接

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

// 未 url 重写
https://www.ilxtx.com/?author=1 

// 已 url 重写
https://www.ilxtx.com/author/admin

其中未 url 重写的参数值是用户 id,而 url 重写后的参数值是用户名。通常,我们都使用了 url 重写,也就是修改固定链接为非默认带?的样式,而这样就会导致作者存档页链接暴露了用户名,这样就直接暴露了登录 WordPress 的用户名,特别是管理员的用户名!存在安全隐患。一个不错的解决方法是将 WordPress 作者存档链接中的用户名改为昵称,方法如下。

改为用户昵称

在 functions.php 中加入以下代码:

/**
* 将 WordPress 作者存档链接中的用户名改为用户昵称(完美版) - 龙笑天下
* https://www.ilxtx.com/use-user-nickname-or-id-for-author-slug.html
* 20170527:修复原 wordpress 大学版本的中文昵称 404 问题
*/
//使用昵称替换用户名,通过用户 ID 进行查询
add_filter( 'request', 'lxtx_wpdaxue_request' );
function lxtx_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", urldecode( $query_vars['author_name'] ) ) );
        if ( $author_id ) {
            $query_vars['author'] = $author_id;
            unset( $query_vars['author_name'] );
        }
    }
    return $query_vars;
}

//使用昵称替换链接中的用户名
add_filter( 'author_link', 'lxtx_wpdaxue_author_link', 10, 3 );
function lxtx_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;
}
Wordpress 大学旧版:中文昵称会 404

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

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

缺陷:当用户昵称为中文时,会出现 404,求高手修复~

在网上找了很久的修复这个中文昵称 404 问题,结果为 0,今天(20170527)在查另一个问题的时候,偶然看到了只言片语,结果一试,果然成功了~
在此非常感谢此文《WordPress 中文昵称问题解决方法小结》作者的思路及解决方法!

WordPress 用户存档链接中文昵称 404 问题的思路及解决方法来源

WordPress 用户存档链接中文昵称 404 问题的思路及解决方法来源

改为用户 ID

如果是用的上面这个方法,在多用户博客中,可能会存在昵称相同的情况,这时候只会显示 ID 较早的用户(最好的解决思路是修改个人资料时,如果使用了相同昵称,进行提示。但是不知具体如何实现,如果有朋友知道,希望告知!)。

在这里介绍另一种不会重复的方法,就是将 WordPress 作者存档链接中的用户名改为用户 ID。代码如下:

/**
 * 将 WordPress 作者存档链接中的用户名改为用户 ID - 龙笑天下
 * https://www.ilxtx.com/use-user-nickname-or-id-for-author-slug.html
 * 修改 url 重写后的作者存档页的链接变量
 * @since yundanran-3 beta 2
 * 2013 年 10 月 8 日 23:23:49
 */
add_filter( 'author_link', 'lxtx_yundanran_author_link', 10, 2 );
function lxtx_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;
}

/**
 * 替换作者的存档页的用户名,防止被其他用途
 * 作者存档页链接有 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 http://www.wpdaxue.com/use-nickname-for-author-slug.html
 */
add_filter( 'request', 'lxtx_yundanran_author_link_request' );
function lxtx_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;
}

修改之后的效果见本站的作者存档链接~

友情提示:使用代码后,最好保存下固定链接,以免出现 404!

另:本文的方法并不能完全的隐藏掉管理员的登录用户名,进一步隐藏管理员用户名的方法详见下面这篇文章:

(全网独家)如何正确的避免你的 Wordpress 管理员登录用户名被暴露-BG
(全网独家)如何正确的避免你的 Wordpress 管理员登录用户名被暴露

(全网独家)如何正确的避免你的 Wordpress 管理员登录用户名被暴露

昨晚在研究评论结构时,网站右键查看源代码,无意间发现自己的管理员用户名被暴露了... 图 1 评论中暴露登录用户名 如上图,在博主的评论的 class 里看到的 test10 是我本地的测试网站的管理...

参考文章

将 WordPress 作者存档链接中的用户名改为昵称
将 WordPress 作者存档链接中的用户名改为用户 ID

「点点赞赏,手留余香」

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

2017-05-01

2017-06-05

发表评论

表情 格式 贴图 链接 私密 签到
Dragon主题购买阿里云特价云服务器1核2G低至86元,N4共享型服务器3年仅需799元腾讯云特价云服务器1核2G 88元/年 2核4G3M688元/3年,更有千元代金券礼包免费领!
评论
正在努力加载中...
扫一扫二维码分享
×
We use cookies on our website to give you the most relevant experience by remembering your preferences and repeat visits. By clicking “Accept”, you consent to the use of ALL the cookies. Learn more