问题描述

您好,社区,是否可以将默认用户名 slug 更改为昵称 (如果有)?

默认情况下,url 就像:http://domain.tld/author/(admin),是否可以重写并更改为 http://domain.tld/author/(nickname),所以如果用户从配置文件页面更改昵称,那么它将更改为用户给出的新名称?

非常感谢!菲利普

最佳解决方案

我看到两种方法来解决这个问题:更改形成作者 URL 的数据,或者改变作者的 URL 。您可能也应该处理重定向,因此,当用户更改昵称时,用户归档的旧网址会继续工作。

更改作者网址

这个问题有两个部分:处理与作者昵称的传入链接,而不是作者 slug,并使用昵称而不是标准的 s and 生成作者发布的网址。

第一部分是通过挂载到 request 过滤器中,检查是否是作者请求,并通过昵称而不是 slug 查找作者。如果我们找到作者,我们更改查询参数以使用作者 ID 。

add_filter( 'request', 'wpse5742_request' );
function wpse5742_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;
}

第二部分是通过挂入 author_link 过滤器,并用昵称替换标准作者部分 (由 $author_nicename 指示) 。

add_filter( 'author_link', 'wpse5742_author_link', 10, 3 );
function wpse5742_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;
}

更改形成作者网址的数据

更简单的方法是更新数据库中未使用的 user_nicename 字段。我认为它是从用户登录生成的,从未改变过。但我不是用户管理方面的专家,所以使用它自己承担风险。

add_action( 'user_profile_update_errors', 'wpse5742_set_user_nicename_to_nickname', 10, 3 );
function wpse5742_set_user_nicename_to_nickname( &$errors, $update, &$user )
{
    if ( ! empty( $user->nickname ) ) {
        $user->user_nicename = sanitize_title( $user->nickname, $user->display_name );
    }
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。