Я вижу два способа решения этой проблемы: изменение данных, формирующих URL автора, или изменение URL автора. Вы, вероятно, должны обрабатывать и перенаправления, поэтому старые URL-адреса в пользовательских архивах продолжают работать, когда пользователь меняет свой ник.
Изменение URL автора
Этот вопрос состоит из двух частей: обрабатывать входящие ссылки с псевдонимом автора, а не слагом автора, и генерировать URL-адреса сообщений автора с псевдонимом вместо стандартного слага.
Первая часть решается путем подключения к request
фильтру, проверки, является ли это запросом автора, и поиска автора по псевдониму вместо слаг. Если мы найдем автора, мы изменим параметры запроса, чтобы использовать идентификатор автора.
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 );
}
}