将 WordPress 作者存档链接中的用户名改为昵称或 ID(修复中文昵称 404)
什么是作者存档页链接 wordpress 的里的所有注册用户都有一个专属的链接,称之为作者存档页链接,通常是这…
什么是作者存档页链接
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 作者存档链接中的用户名改为用户昵称 - 龙笑天下
* https://www.ilxtx.com/use-user-nickname-or-id-for-author-slug.html
* 将 WordPress 作者存档链接中的用户名改为昵称
* https://www.wpdaxue.com/use-nickname-for-author-slug.html
*/
//使用昵称替换用户名,通过用户 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", $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;
}
接着我们在个人资料中修改昵称为其他名称,比如,用户 demo 的昵称改为了 lxtx,这样一来,作者存档的链接就自动由 http://域名/author/demo 变成了 http://域名/author/lxtx
此外,记得将“公开显示为”设置为非用户名,这样就 OK 啦!
缺陷:当用户昵称为中文时,会出现 404,求高手修复~在网上找了很久的修复这个中文昵称 404 问题,结果为 0,今天(20170527)在查另一个问题的时候,偶然看到了只言片语,结果一试,果然成功了~
在此非常感谢此文《WordPress 中文昵称问题解决方法小结》作者的思路及解决方法!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 作者存档链接中的用户名改为昵称
将 WordPress 作者存档链接中的用户名改为用户 ID
本文收集自互联网,转载请注明来源。
如有侵权,请联系 wper_net@163.com 删除。
还没有任何评论,赶紧来占个楼吧!