社区大家好,
是否可以将默认的用户名slug更改为昵称(如果可用)?
默认情况下,URL类似于:http://domain.tld/author/(admin),
是否有可能重写并更改为http://domain.tld/author/(nickname),因此,如果用户更改了昵称,从配置文件页面中,它也会更改为用户指定的新名称吗?
非常感谢!
菲利普
社区大家好,
是否可以将默认的用户名slug更改为昵称(如果可用)?
默认情况下,URL类似于:http://domain.tld/author/(admin),
是否有可能重写并更改为http://domain.tld/author/(nickname),因此,如果用户更改了昵称,从配置文件页面中,它也会更改为用户指定的新名称吗?
非常感谢!
菲利普
Answers:
我看到解决此问题的两种方法:更改构成作者URL的数据,或更改作者URL。您可能也应该处理重定向,因此当用户更改其昵称时,指向用户档案的旧URL仍然有效。
这个问题有两个部分:处理使用作者昵称而不是作者子词的链接,并使用昵称而不是标准子词来生成作者帖子网址。
解决第一部分的方法是,钩住request
过滤器,检查它是否是作者请求,并通过昵称而不是从头查找作者。如果找到作者,则可以更改查询参数以使用作者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 );
}
}
使用此插件:http : //wordpress.org/extend/plugins/display-name-author-permalink/
虽然尚未针对3.2.1进行测试。我一直在使用它,没有问题。
如果您在激活插件时收到标题错误,则会在此处找到修复程序:http : //wordpresscloaker.com/blog/how-to-fix-wordpress-plugin-does-not-have-a-valid-header -error.html
一个简单的方法是插件Author Slug
您也可以使用小代码:
add_action('init', 'set_new_author_base');
function set_new_author_base() {
global $wp_rewrite;
$author_slug = 'new_slug';
$wp_rewrite->author_base = $author_slug;
}