Widzę dwa sposoby rozwiązania tego problemu: zmiana danych tworzących adres URL autora lub zmiana adresu URL autora. Prawdopodobnie powinieneś również obsługiwać przekierowania, więc stare adresy URL do archiwów użytkowników będą działać, gdy użytkownik zmieni swój pseudonim.
Zmiana adresu URL autora
Pytanie to składa się z dwóch części: obsługiwać przychodzące linki z pseudonimem autora zamiast informacji o autorze i generować adresy URL autora z pseudonimem zamiast standardowej informacji o pracy.
Pierwszą część rozwiązuje zaczepiając się w request
filtrze, sprawdzając, czy jest to prośba autora, i szukając autora według pseudonimu zamiast ślimaka. Jeśli znajdziemy autora, zmieniamy parametry zapytania, aby użyć identyfikatora autora.
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;
}
Druga część polega na zaczepieniu się w author_link
filtrze i zastąpieniu standardowej części autora (oznaczonej przez $author_nicename
) pseudonimem.
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;
}
Zmiana danych tworzących adres URL autora
Być może łatwiejszym sposobem byłoby zaktualizowanie w innym przypadku nieużywanego user_nicename
pola w bazie danych. Wydaje mi się, że jest generowany na podstawie loginu użytkownika i nigdy potem się nie zmienia. Ale nie jestem ekspertem w zarządzaniu użytkownikami, więc używaj go na własne ryzyko.
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 );
}
}