我看到了两种解决此问题的方法:更改构成作者URL的数据,或更改作者URL。您可能也应该处理重定向,这样当用户更改其昵称时,用户存档的旧URL会继续工作。
更改作者URL这个问题有两个部分:使用作者昵称而不是作者slug来处理传入链接,以及使用昵称而不是标准slug来生成作者帖子URL。
第一部分通过钩住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;
}
更改构成作者URL的数据可能更简单的方法是更新其他未使用的
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 );
}
}